diff --git a/src/CRE/GL/array_buffer.cpp b/src/CRE/GL/array_buffer.cpp index e7d71f94..7b5cb1b7 100644 --- a/src/CRE/GL/array_buffer.cpp +++ b/src/CRE/GL/array_buffer.cpp @@ -5,13 +5,10 @@ #include "array_buffer.hpp" #include "../gl_rend_state.hpp" +#include "../gl_state.hpp" namespace GL { - void ArrayBuffer::Bind(bool force) { - gl_rend_state.bind_array_buffer(buffer, force); - } - - void ArrayBuffer::Create(size_t size) { + void ArrayBuffer::Create(gl_state_struct& gl_st, size_t size) { if (buffer) return; @@ -21,7 +18,7 @@ namespace GL { } else { glGenBuffers(1, &buffer); - gl_rend_state.bind_array_buffer(buffer, true); + gl_st.bind_array_buffer(buffer); if (GL_VERSION_4_4) glBufferStorage(GL_ARRAY_BUFFER, (GLsizeiptr)size, 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT); @@ -30,7 +27,7 @@ namespace GL { } } - void ArrayBuffer::Create(size_t size, const void* data, bool dynamic) { + void ArrayBuffer::Create(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic) { if (buffer) return; @@ -41,7 +38,7 @@ namespace GL { } else { glGenBuffers(1, &buffer); - gl_rend_state.bind_array_buffer(buffer, true); + gl_st.bind_array_buffer(buffer); if (GL_VERSION_4_4) glBufferStorage(GL_ARRAY_BUFFER, (GLsizeiptr)size, data, dynamic ? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0); @@ -58,7 +55,7 @@ namespace GL { } } - void* ArrayBuffer::MapMemory() { + void* ArrayBuffer::MapMemory(gl_state_struct& gl_st) { if (!buffer) return 0; @@ -66,7 +63,7 @@ namespace GL { if (GL_VERSION_4_5) data = glMapNamedBuffer(buffer, GL_WRITE_ONLY); else { - gl_rend_state.bind_array_buffer(buffer); + gl_st.bind_array_buffer(buffer); data = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); } @@ -77,12 +74,36 @@ namespace GL { glUnmapNamedBuffer(buffer); else { glUnmapBuffer(GL_ARRAY_BUFFER); - gl_rend_state.bind_array_buffer(0); + gl_st.bind_array_buffer(0); } return 0; } - void ArrayBuffer::UnmapMemory() { + void* ArrayBuffer::MapMemory(p_gl_rend_state& p_gl_rend_st) { + if (!buffer) + return 0; + + void* data; + if (GL_VERSION_4_5) + data = glMapNamedBuffer(buffer, GL_WRITE_ONLY); + else { + p_gl_rend_st.bind_array_buffer(buffer); + data = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); + } + + if (data) + return data; + + if (GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_ARRAY_BUFFER); + p_gl_rend_st.bind_array_buffer(0); + } + return 0; + } + + void ArrayBuffer::UnmapMemory(gl_state_struct& gl_st) { if (!buffer) return; @@ -90,18 +111,42 @@ namespace GL { glUnmapNamedBuffer(buffer); else { glUnmapBuffer(GL_ARRAY_BUFFER); - gl_rend_state.bind_array_buffer(0); + gl_st.bind_array_buffer(0); } } - void ArrayBuffer::WriteMemory(size_t offset, size_t size, const void* data) { + void ArrayBuffer::UnmapMemory(p_gl_rend_state& p_gl_rend_st) { + if (!buffer) + return; + + if (GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_ARRAY_BUFFER); + p_gl_rend_st.bind_array_buffer(0); + } + } + + void ArrayBuffer::WriteMemory(gl_state_struct& gl_st, size_t offset, size_t size, const void* data) { if (!buffer || !size) return; if (GL_VERSION_4_5) glNamedBufferSubData(buffer, (GLsizeiptr)offset, (GLsizeiptr)size, data); else { - gl_rend_state.bind_array_buffer(buffer); + gl_st.bind_array_buffer(buffer); + glBufferSubData(GL_ARRAY_BUFFER, (GLsizeiptr)offset, (GLsizeiptr)size, data); + } + } + + void ArrayBuffer::WriteMemory(p_gl_rend_state& p_gl_rend_st, size_t offset, size_t size, const void* data) { + if (!buffer || !size) + return; + + if (GL_VERSION_4_5) + glNamedBufferSubData(buffer, (GLsizeiptr)offset, (GLsizeiptr)size, data); + else { + p_gl_rend_st.bind_array_buffer(buffer); glBufferSubData(GL_ARRAY_BUFFER, (GLsizeiptr)offset, (GLsizeiptr)size, data); } } diff --git a/src/CRE/GL/array_buffer.hpp b/src/CRE/GL/array_buffer.hpp index caf8e9ae..a3aa6dd0 100644 --- a/src/CRE/GL/array_buffer.hpp +++ b/src/CRE/GL/array_buffer.hpp @@ -8,6 +8,9 @@ #include "../../KKdLib/default.hpp" #include "../gl.hpp" +struct gl_state_struct; +struct p_gl_rend_state; + namespace GL { struct ArrayBuffer { private: @@ -26,13 +29,15 @@ namespace GL { } - void Bind(bool force = false); - void Create(size_t size); - void Create(size_t size, const void* data, bool dynamic = false); + void Create(gl_state_struct& gl_st, size_t size); + void Create(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic = false); void Destroy(); - void* MapMemory(); - void UnmapMemory(); - void WriteMemory(size_t offset, size_t size, const void* data); + void* MapMemory(gl_state_struct& gl_st); + void* MapMemory(p_gl_rend_state& p_gl_rend_st); + void UnmapMemory(gl_state_struct& gl_st); + void UnmapMemory(p_gl_rend_state& p_gl_rend_st); + void WriteMemory(gl_state_struct& gl_st, size_t offset, size_t size, const void* data); + void WriteMemory(p_gl_rend_state& p_gl_rend_st, size_t offset, size_t size, const void* data); inline bool IsNull() { return !buffer; @@ -43,8 +48,13 @@ namespace GL { } template - inline void WriteMemory(T& data) { - WriteMemory(0, sizeof(T), &data); + inline void WriteMemory(gl_state_struct& gl_st, T& data) { + WriteMemory(gl_st, 0, sizeof(T), &data); + } + + template + inline void WriteMemory(p_gl_rend_state& p_gl_rend_st, T& data) { + WriteMemory(p_gl_rend_st, 0, sizeof(T), &data); } inline operator GLuint() const { diff --git a/src/CRE/GL/element_array_buffer.cpp b/src/CRE/GL/element_array_buffer.cpp index 76b5710d..9ae36251 100644 --- a/src/CRE/GL/element_array_buffer.cpp +++ b/src/CRE/GL/element_array_buffer.cpp @@ -5,13 +5,10 @@ #include "element_array_buffer.hpp" #include "../gl_rend_state.hpp" +#include "../gl_state.hpp" namespace GL { - void ElementArrayBuffer::Bind(bool force) { - gl_rend_state.bind_element_array_buffer(buffer, force); - } - - void ElementArrayBuffer::Create(size_t size) { + void ElementArrayBuffer::Create(gl_state_struct& gl_st, size_t size) { if (buffer) return; @@ -21,7 +18,7 @@ namespace GL { } else { glGenBuffers(1, &buffer); - gl_rend_state.bind_element_array_buffer(buffer, true); + gl_st.bind_element_array_buffer(buffer, true); if (GL_VERSION_4_4) glBufferStorage(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)size, 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT); @@ -30,7 +27,7 @@ namespace GL { } } - void ElementArrayBuffer::Create(size_t size, const void* data, bool dynamic) { + void ElementArrayBuffer::Create(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic) { if (buffer) return; @@ -41,7 +38,7 @@ namespace GL { } else { glGenBuffers(1, &buffer); - gl_rend_state.bind_element_array_buffer(buffer, true); + gl_st.bind_element_array_buffer(buffer, true); if (GL_VERSION_4_4) glBufferStorage(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)size, data, dynamic ? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0); @@ -58,7 +55,7 @@ namespace GL { } } - void* ElementArrayBuffer::MapMemory() { + void* ElementArrayBuffer::MapMemory(gl_state_struct& gl_st) { if (!buffer) return 0; @@ -66,7 +63,7 @@ namespace GL { if (GL_VERSION_4_5) data = glMapNamedBuffer(buffer, GL_WRITE_ONLY); else { - gl_rend_state.bind_element_array_buffer(buffer); + gl_st.bind_element_array_buffer(buffer); data = glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY); } @@ -77,12 +74,36 @@ namespace GL { glUnmapNamedBuffer(buffer); else { glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER); - gl_rend_state.bind_element_array_buffer(0); + gl_st.bind_element_array_buffer(0); } return 0; } - void ElementArrayBuffer::UnmapMemory() { + void* ElementArrayBuffer::MapMemory(p_gl_rend_state& p_gl_rend_st) { + if (!buffer) + return 0; + + void* data; + if (GL_VERSION_4_5) + data = glMapNamedBuffer(buffer, GL_WRITE_ONLY); + else { + p_gl_rend_st.bind_element_array_buffer(buffer); + data = glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY); + } + + if (data) + return data; + + if (GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER); + p_gl_rend_st.bind_element_array_buffer(0); + } + return 0; + } + + void ElementArrayBuffer::UnmapMemory(gl_state_struct& gl_st) { if (!buffer) return; @@ -90,18 +111,42 @@ namespace GL { glUnmapNamedBuffer(buffer); else { glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER); - gl_rend_state.bind_element_array_buffer(0); + gl_st.bind_element_array_buffer(0); } } - void ElementArrayBuffer::WriteMemory(size_t offset, size_t size, const void* data) { + void ElementArrayBuffer::UnmapMemory(p_gl_rend_state& p_gl_rend_st) { + if (!buffer) + return; + + if (GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER); + p_gl_rend_st.bind_element_array_buffer(0); + } + } + + void ElementArrayBuffer::WriteMemory(gl_state_struct& gl_st, size_t offset, size_t size, const void* data) { if (!buffer || !size) return; if (GL_VERSION_4_5) glNamedBufferSubData(buffer, (GLsizeiptr)offset, (GLsizeiptr)size, data); else { - gl_rend_state.bind_element_array_buffer(buffer); + gl_st.bind_element_array_buffer(buffer); + glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)offset, (GLsizeiptr)size, data); + } + } + + void ElementArrayBuffer::WriteMemory(p_gl_rend_state& p_gl_rend_st, size_t offset, size_t size, const void* data) { + if (!buffer || !size) + return; + + if (GL_VERSION_4_5) + glNamedBufferSubData(buffer, (GLsizeiptr)offset, (GLsizeiptr)size, data); + else { + p_gl_rend_st.bind_element_array_buffer(buffer); glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)offset, (GLsizeiptr)size, data); } } diff --git a/src/CRE/GL/element_array_buffer.hpp b/src/CRE/GL/element_array_buffer.hpp index b9f1d65e..dd76ad17 100644 --- a/src/CRE/GL/element_array_buffer.hpp +++ b/src/CRE/GL/element_array_buffer.hpp @@ -8,6 +8,9 @@ #include "../../KKdLib/default.hpp" #include "../gl.hpp" +struct gl_state_struct; +struct p_gl_rend_state; + namespace GL { struct ElementArrayBuffer { private: @@ -26,13 +29,15 @@ namespace GL { } - void Bind(bool force = false); - void Create(size_t size); - void Create(size_t size, const void* data, bool dynamic = false); + void Create(gl_state_struct& gl_st, size_t size); + void Create(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic = false); void Destroy(); - void* MapMemory(); - void UnmapMemory(); - void WriteMemory(size_t offset, size_t size, const void* data); + void* MapMemory(gl_state_struct& gl_st); + void* MapMemory(p_gl_rend_state& p_gl_rend_st); + void UnmapMemory(gl_state_struct& gl_st); + void UnmapMemory(p_gl_rend_state& p_gl_rend_st); + void WriteMemory(gl_state_struct& gl_st, size_t offset, size_t size, const void* data); + void WriteMemory(p_gl_rend_state& p_gl_rend_st, size_t offset, size_t size, const void* data); inline bool IsNull() { return !buffer; @@ -43,8 +48,13 @@ namespace GL { } template - inline void WriteMemory(T& data) { - WriteMemory(0, sizeof(T), &data); + inline void WriteMemory(gl_state_struct& gl_st, T& data) { + WriteMemory(gl_st, 0, sizeof(T), &data); + } + + template + inline void WriteMemory(p_gl_rend_state& p_gl_rend_st, T& data) { + WriteMemory(p_gl_rend_st, 0, sizeof(T), &data); } inline operator GLuint() const { diff --git a/src/CRE/GL/shader_storage_buffer.cpp b/src/CRE/GL/shader_storage_buffer.cpp index 0a09c7fc..e43354f0 100644 --- a/src/CRE/GL/shader_storage_buffer.cpp +++ b/src/CRE/GL/shader_storage_buffer.cpp @@ -5,13 +5,10 @@ #include "shader_storage_buffer.hpp" #include "../gl_rend_state.hpp" +#include "../gl_state.hpp" namespace GL { - void ShaderStorageBuffer::Bind(int32_t index, bool force) { - gl_rend_state.bind_shader_storage_buffer_base(index, buffer, force); - } - - void ShaderStorageBuffer::Create(size_t size) { + void ShaderStorageBuffer::Create(gl_state_struct& gl_st, size_t size) { if (buffer) return; @@ -21,7 +18,7 @@ namespace GL { } else { glGenBuffers(1, &buffer); - gl_rend_state.bind_shader_storage_buffer(buffer, true); + gl_st.bind_shader_storage_buffer(buffer, true); if (GL_VERSION_4_4) glBufferStorage(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)size, 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT); @@ -30,7 +27,7 @@ namespace GL { } } - void ShaderStorageBuffer::Create(size_t size, const void* data, bool dynamic) { + void ShaderStorageBuffer::Create(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic) { if (buffer) return; @@ -41,7 +38,7 @@ namespace GL { } else { glGenBuffers(1, &buffer); - gl_rend_state.bind_shader_storage_buffer(buffer, true); + gl_st.bind_shader_storage_buffer(buffer, true); if (GL_VERSION_4_4) glBufferStorage(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)size, data, dynamic ? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0); @@ -58,7 +55,7 @@ namespace GL { } } - void* ShaderStorageBuffer::MapMemory() { + void* ShaderStorageBuffer::MapMemory(gl_state_struct& gl_st) { if (!buffer) return 0; @@ -66,7 +63,7 @@ namespace GL { if (GL_VERSION_4_5) data = glMapNamedBuffer(buffer, GL_WRITE_ONLY); else { - gl_rend_state.bind_shader_storage_buffer(buffer); + gl_st.bind_shader_storage_buffer(buffer); data = glMapBuffer(GL_SHADER_STORAGE_BUFFER, GL_WRITE_ONLY); } @@ -77,12 +74,36 @@ namespace GL { glUnmapNamedBuffer(buffer); else { glUnmapBuffer(GL_SHADER_STORAGE_BUFFER); - gl_rend_state.bind_shader_storage_buffer(0); + gl_st.bind_shader_storage_buffer(0); } return 0; } - void ShaderStorageBuffer::UnmapMemory() { + void* ShaderStorageBuffer::MapMemory(p_gl_rend_state& p_gl_rend_st) { + if (!buffer) + return 0; + + void* data; + if (GL_VERSION_4_5) + data = glMapNamedBuffer(buffer, GL_WRITE_ONLY); + else { + p_gl_rend_st.bind_shader_storage_buffer(buffer); + data = glMapBuffer(GL_SHADER_STORAGE_BUFFER, GL_WRITE_ONLY); + } + + if (data) + return data; + + if (GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_SHADER_STORAGE_BUFFER); + p_gl_rend_st.bind_shader_storage_buffer(0); + } + return 0; + } + + void ShaderStorageBuffer::UnmapMemory(gl_state_struct& gl_st) { if (!buffer) return; @@ -90,18 +111,42 @@ namespace GL { glUnmapNamedBuffer(buffer); else { glUnmapBuffer(GL_SHADER_STORAGE_BUFFER); - gl_rend_state.bind_shader_storage_buffer(0); + gl_st.bind_shader_storage_buffer(0); } } - void ShaderStorageBuffer::WriteMemory(size_t offset, size_t size, const void* data) { + void ShaderStorageBuffer::UnmapMemory(p_gl_rend_state& p_gl_rend_st) { + if (!buffer) + return; + + if (GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_SHADER_STORAGE_BUFFER); + p_gl_rend_st.bind_shader_storage_buffer(0); + } + } + + void ShaderStorageBuffer::WriteMemory(gl_state_struct& gl_st, size_t offset, size_t size, const void* data) { if (!buffer || !size) return; if (GL_VERSION_4_5) glNamedBufferSubData(buffer, (GLsizeiptr)offset, (GLsizeiptr)size, data); else { - gl_rend_state.bind_shader_storage_buffer(buffer); + gl_st.bind_shader_storage_buffer(buffer); + glBufferSubData(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)offset, (GLsizeiptr)size, data); + } + } + + void ShaderStorageBuffer::WriteMemory(p_gl_rend_state& p_gl_rend_st, size_t offset, size_t size, const void* data) { + if (!buffer || !size) + return; + + if (GL_VERSION_4_5) + glNamedBufferSubData(buffer, (GLsizeiptr)offset, (GLsizeiptr)size, data); + else { + p_gl_rend_st.bind_shader_storage_buffer(buffer); glBufferSubData(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)offset, (GLsizeiptr)size, data); } } diff --git a/src/CRE/GL/shader_storage_buffer.hpp b/src/CRE/GL/shader_storage_buffer.hpp index 76a8a329..46f9685e 100644 --- a/src/CRE/GL/shader_storage_buffer.hpp +++ b/src/CRE/GL/shader_storage_buffer.hpp @@ -8,6 +8,9 @@ #include "../../KKdLib/default.hpp" #include "../gl.hpp" +struct gl_state_struct; +struct p_gl_rend_state; + namespace GL { struct ShaderStorageBuffer { private: @@ -26,13 +29,15 @@ namespace GL { } - void Bind(int32_t index, bool force = false); - void Create(size_t size); - void Create(size_t size, const void* data, bool dynamic = false); + void Create(gl_state_struct& gl_st, size_t size); + void Create(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic = false); void Destroy(); - void* MapMemory(); - void UnmapMemory(); - void WriteMemory(size_t offset, size_t size, const void* data); + void* MapMemory(gl_state_struct& gl_st); + void* MapMemory(p_gl_rend_state& p_gl_rend_st); + void UnmapMemory(gl_state_struct& gl_st); + void UnmapMemory(p_gl_rend_state& p_gl_rend_st); + void WriteMemory(gl_state_struct& gl_st, size_t offset, size_t size, const void* data); + void WriteMemory(p_gl_rend_state& p_gl_rend_st, size_t offset, size_t size, const void* data); inline bool IsNull() { return !buffer; @@ -43,8 +48,13 @@ namespace GL { } template - inline void WriteMemory(T& data) { - WriteMemory(0, sizeof(T), &data); + inline void WriteMemory(gl_state_struct& gl_st, T& data) { + WriteMemory(gl_st, 0, sizeof(T), &data); + } + + template + inline void WriteMemory(p_gl_rend_state& p_gl_rend_st, T& data) { + WriteMemory(p_gl_rend_st, 0, sizeof(T), &data); } inline operator GLuint() const { diff --git a/src/CRE/GL/uniform_buffer.cpp b/src/CRE/GL/uniform_buffer.cpp index a36b5cda..78ab0ec7 100644 --- a/src/CRE/GL/uniform_buffer.cpp +++ b/src/CRE/GL/uniform_buffer.cpp @@ -5,13 +5,10 @@ #include "uniform_buffer.hpp" #include "../gl_rend_state.hpp" +#include "../gl_state.hpp" namespace GL { - void UniformBuffer::Bind(int32_t index, bool force) { - gl_rend_state.bind_uniform_buffer_base(index, buffer, force); - } - - void UniformBuffer::Create(size_t size) { + void UniformBuffer::Create(gl_state_struct& gl_st, size_t size) { if (buffer) return; @@ -21,7 +18,7 @@ namespace GL { } else { glGenBuffers(1, &buffer); - gl_rend_state.bind_uniform_buffer(buffer, true); + gl_st.bind_uniform_buffer(buffer, true); if (GL_VERSION_4_4) glBufferStorage(GL_UNIFORM_BUFFER, (GLsizeiptr)size, 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT); @@ -30,7 +27,7 @@ namespace GL { } } - void UniformBuffer::Create(size_t size, const void* data, bool dynamic) { + void UniformBuffer::Create(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic) { if (buffer) return; @@ -41,7 +38,7 @@ namespace GL { } else { glGenBuffers(1, &buffer); - gl_rend_state.bind_uniform_buffer(buffer, true); + gl_st.bind_uniform_buffer(buffer, true); if (GL_VERSION_4_4) glBufferStorage(GL_UNIFORM_BUFFER, (GLsizeiptr)size, data, dynamic ? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0); @@ -58,7 +55,7 @@ namespace GL { } } - void* UniformBuffer::MapMemory() { + void* UniformBuffer::MapMemory(gl_state_struct& gl_st) { if (!buffer) return 0; @@ -66,7 +63,7 @@ namespace GL { if (GL_VERSION_4_5) data = glMapNamedBuffer(buffer, GL_WRITE_ONLY); else { - gl_rend_state.bind_uniform_buffer(buffer); + gl_st.bind_uniform_buffer(buffer); data = glMapBuffer(GL_UNIFORM_BUFFER, GL_WRITE_ONLY); } @@ -77,12 +74,36 @@ namespace GL { glUnmapNamedBuffer(buffer); else { glUnmapBuffer(GL_UNIFORM_BUFFER); - gl_rend_state.bind_uniform_buffer(0); + gl_st.bind_uniform_buffer(0); } return 0; } - void UniformBuffer::UnmapMemory() { + void* UniformBuffer::MapMemory(p_gl_rend_state& p_gl_rend_st) { + if (!buffer) + return 0; + + void* data; + if (GL_VERSION_4_5) + data = glMapNamedBuffer(buffer, GL_WRITE_ONLY); + else { + p_gl_rend_st.bind_uniform_buffer(buffer); + data = glMapBuffer(GL_UNIFORM_BUFFER, GL_WRITE_ONLY); + } + + if (data) + return data; + + if (GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_UNIFORM_BUFFER); + p_gl_rend_st.bind_uniform_buffer(0); + } + return 0; + } + + void UniformBuffer::UnmapMemory(gl_state_struct& gl_st) { if (!buffer) return; @@ -90,18 +111,42 @@ namespace GL { glUnmapNamedBuffer(buffer); else { glUnmapBuffer(GL_UNIFORM_BUFFER); - gl_rend_state.bind_uniform_buffer(0); + gl_st.bind_uniform_buffer(0); } } - void UniformBuffer::WriteMemory(size_t offset, size_t size, const void* data) { + void UniformBuffer::UnmapMemory(p_gl_rend_state& p_gl_rend_st) { + if (!buffer) + return; + + if (GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_UNIFORM_BUFFER); + p_gl_rend_st.bind_uniform_buffer(0); + } + } + + void UniformBuffer::WriteMemory(gl_state_struct& gl_st, size_t offset, size_t size, const void* data) { if (!buffer || !size) return; if (GL_VERSION_4_5) glNamedBufferSubData(buffer, (GLsizeiptr)offset, (GLsizeiptr)size, data); else { - gl_rend_state.bind_uniform_buffer(buffer); + gl_st.bind_uniform_buffer(buffer); + glBufferSubData(GL_UNIFORM_BUFFER, (GLsizeiptr)offset, (GLsizeiptr)size, data); + } + } + + void UniformBuffer::WriteMemory(p_gl_rend_state& p_gl_rend_st, size_t offset, size_t size, const void* data) { + if (!buffer || !size) + return; + + if (GL_VERSION_4_5) + glNamedBufferSubData(buffer, (GLsizeiptr)offset, (GLsizeiptr)size, data); + else { + p_gl_rend_st.bind_uniform_buffer(buffer); glBufferSubData(GL_UNIFORM_BUFFER, (GLsizeiptr)offset, (GLsizeiptr)size, data); } } diff --git a/src/CRE/GL/uniform_buffer.hpp b/src/CRE/GL/uniform_buffer.hpp index d7139557..75c00624 100644 --- a/src/CRE/GL/uniform_buffer.hpp +++ b/src/CRE/GL/uniform_buffer.hpp @@ -8,6 +8,9 @@ #include "../../KKdLib/default.hpp" #include "../gl.hpp" +struct gl_state_struct; +struct p_gl_rend_state; + namespace GL { struct UniformBuffer { private: @@ -26,13 +29,15 @@ namespace GL { } - void Bind(int32_t index, bool force = false); - void Create(size_t size); - void Create(size_t size, const void* data, bool dynamic = false); + void Create(gl_state_struct& gl_st, size_t size); + void Create(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic = false); void Destroy(); - void* MapMemory(); - void UnmapMemory(); - void WriteMemory(size_t offset, size_t size, const void* data); + void* MapMemory(gl_state_struct& gl_st); + void* MapMemory(p_gl_rend_state& p_gl_rend_st); + void UnmapMemory(gl_state_struct& gl_st); + void UnmapMemory(p_gl_rend_state& p_gl_rend_st); + void WriteMemory(gl_state_struct& gl_st, size_t offset, size_t size, const void* data); + void WriteMemory(p_gl_rend_state& p_gl_rend_st, size_t offset, size_t size, const void* data); inline bool IsNull() { return !buffer; @@ -43,8 +48,13 @@ namespace GL { } template - inline void WriteMemory(T& data) { - WriteMemory(0, sizeof(T), &data); + inline void WriteMemory(gl_state_struct& gl_st, T& data) { + WriteMemory(gl_st, 0, sizeof(T), &data); + } + + template + inline void WriteMemory(p_gl_rend_state& p_gl_rend_st, T& data) { + WriteMemory(p_gl_rend_st, 0, sizeof(T), &data); } inline operator GLuint() const { diff --git a/src/CRE/Glitter/effect_inst.cpp b/src/CRE/Glitter/effect_inst.cpp index b162e0ed..fe611dfe 100644 --- a/src/CRE/Glitter/effect_inst.cpp +++ b/src/CRE/Glitter/effect_inst.cpp @@ -204,8 +204,8 @@ namespace Glitter { } } - void F2EffectInst::Disp(GPM, DispType disp_type) { - render_scene.Disp(GPM_VAL, disp_type); + void F2EffectInst::Disp(GPM, render_data_context& rend_data_ct, DispType disp_type) { + render_scene.Disp(GPM_VAL, rend_data_ct, disp_type); } void F2EffectInst::DispMesh(GPM) { @@ -784,8 +784,8 @@ namespace Glitter { } } - void XEffectInst::Disp(GPM, DispType disp_type) { - render_scene.Disp(GPM_VAL, disp_type); + void XEffectInst::Disp(GPM, render_data_context& rend_data_ct, DispType disp_type) { + render_scene.Disp(GPM_VAL, rend_data_ct, disp_type); } void XEffectInst::DispMesh(GPM) { diff --git a/src/CRE/Glitter/file_reader.cpp b/src/CRE/Glitter/file_reader.cpp index b777e569..90a0708f 100644 --- a/src/CRE/Glitter/file_reader.cpp +++ b/src/CRE/Glitter/file_reader.cpp @@ -10,6 +10,7 @@ #include "../../KKdLib/farc.hpp" #include "../../KKdLib/msgpack.hpp" #include "../data.hpp" +#include "../gl_state.hpp" #include "../object.hpp" #if SHARED_GLITTER_BUFFER #include "../gl_rend_state.hpp" @@ -119,7 +120,7 @@ namespace Glitter { static const GLsizei buffer_size = sizeof(Buffer); - effect_group->vbo.Create(buffer_size * max_count); + effect_group->vbo.Create(gl_state, buffer_size * max_count); if (max_count_quad) { size_t count = max_count_quad / 4 * 5; @@ -132,7 +133,7 @@ namespace Glitter { ebo_data[i + 4] = 0xFFFFFFFF; } - effect_group->ebo.Create(sizeof(uint32_t) * count, ebo_data); + effect_group->ebo.Create(gl_state, sizeof(uint32_t) * count, ebo_data); free_def(ebo_data); } else @@ -160,10 +161,10 @@ namespace Glitter { k->buffer = buffer; glGenVertexArrays(1, &k->vao); - glBindVertexArray(k->vao); - glBindBuffer(GL_ARRAY_BUFFER, vbo); + gl_state.bind_vertex_array(k->vao); + gl_state.bind_array_buffer(vbo); if (k->data.type == PARTICLE_QUAD) - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo); + gl_state.bind_element_array_buffer(ebo, true); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, buffer_size, @@ -184,9 +185,9 @@ namespace Glitter { } if (offset) { - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindVertexArray(0); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + gl_state.bind_array_buffer(0); + gl_state.bind_vertex_array(0); + gl_state.bind_element_array_buffer(0); } } else { diff --git a/src/CRE/Glitter/glitter.cpp b/src/CRE/Glitter/glitter.cpp index 5bec5f81..f1ff7d43 100644 --- a/src/CRE/Glitter/glitter.cpp +++ b/src/CRE/Glitter/glitter.cpp @@ -4,7 +4,7 @@ */ #include "glitter.hpp" -#include "../gl_rend_state.hpp" +#include "../gl_state.hpp" namespace Glitter { const float_t min_emission = 0.01f; @@ -271,12 +271,12 @@ namespace Glitter { buffer = force_malloc(max_count); glGenVertexArrays(1, &vao); - gl_rend_state.bind_vertex_array(vao, true); + gl_state.bind_vertex_array(vao, true); static const GLsizei buffer_size = sizeof(Buffer); vbo.Create(buffer_size * max_count); - vbo.Bind(true); + gl_state.bind_array_buffer(vbo); if (is_quad) { size_t count = max_count / 4 * 5; @@ -290,7 +290,7 @@ namespace Glitter { } ebo.Create(sizeof(uint32_t) * count, ebo_data); - ebo.Bind(true); + gl_state.bind_element_array_buffer(ebo); free_def(ebo_data); } @@ -304,10 +304,10 @@ namespace Glitter { glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, buffer_size, (void*)offsetof(Buffer, color)); - gl_rend_state.bind_array_buffer(0); - gl_rend_state.bind_vertex_array(0); + gl_state.bind_array_buffer(0); + gl_state.bind_vertex_array(0); if (is_quad) - gl_rend_state.bind_element_array_buffer(0); + gl_state.bind_element_array_buffer(0); } void DeleteBuffer(Buffer*& buffer, GLuint& vao, GL::ArrayBuffer& vbo, GL::ElementArrayBuffer& ebo) { diff --git a/src/CRE/Glitter/glitter.hpp b/src/CRE/Glitter/glitter.hpp index b036232c..0972cdb3 100644 --- a/src/CRE/Glitter/glitter.hpp +++ b/src/CRE/Glitter/glitter.hpp @@ -29,6 +29,8 @@ #define SHARED_GLITTER_BUFFER (1) +struct render_data_context; + namespace Glitter { enum CurveFlag { CURVE_RANDOM_RANGE = 0x01, @@ -856,8 +858,8 @@ namespace Glitter { void CalcDispQuadNormal(GPM, F2RenderGroup* rend_group, mat4* model_mat, mat4* dir_mat); void Ctrl(GLT, float_t delta_frame); - void Disp(GPM, DispType disp_type); - void Disp(GPM, F2RenderGroup* rend_group); + void Disp(GPM, render_data_context& rend_data_ct, DispType disp_type); + void Disp(GPM, render_data_context& rend_data_ct, F2RenderGroup* rend_group); }; class XRenderScene : public RenderScene { @@ -878,8 +880,8 @@ namespace Glitter { bool CanDisp(DispType disp_type, bool a3); void CheckUseCamera(); void Ctrl(float_t delta_frame, bool copy_mats); - void Disp(GPM, DispType disp_type); - void Disp(GPM, XRenderGroup* rend_group); + void Disp(GPM, render_data_context& rend_data_ct, DispType disp_type); + void Disp(GPM, render_data_context& rend_data_ct, XRenderGroup* rend_group); void DispMesh(GPM); void DispMesh(GPM, XRenderGroup* rend_group); }; @@ -912,7 +914,7 @@ namespace Glitter { virtual void CalcDisp(GPM) = 0; virtual void Copy(EffectInst* dst, float_t emission) = 0; - virtual void Disp(GPM, DispType disp_type) = 0; + virtual void Disp(GPM, render_data_context& rend_data_ct, DispType disp_type) = 0; virtual void DispMesh(GPM) = 0; virtual void Free(GPM, GLT, float_t emission, bool free) = 0; virtual size_t GetCtrlCount(ParticleType type) = 0; @@ -965,7 +967,7 @@ namespace Glitter { virtual void CalcDisp(GPM) override; virtual void Copy(EffectInst* dst, float_t emission) override; - virtual void Disp(GPM, DispType disp_type) override; + virtual void Disp(GPM, render_data_context& rend_data_ct, DispType disp_type) override; virtual void DispMesh(GPM) override; virtual void Free(GPM, GLT, float_t emission, bool free) override; virtual size_t GetCtrlCount(ParticleType type) override; @@ -1031,7 +1033,7 @@ namespace Glitter { virtual void CalcDisp(GPM) override; virtual void Copy(EffectInst* dst, float_t emission) override; - virtual void Disp(GPM, DispType disp_type) override; + virtual void Disp(GPM, render_data_context& rend_data_ct, DispType disp_type) override; virtual void DispMesh(GPM) override; virtual void Free(GPM, GLT, float_t emission, bool free) override; virtual size_t GetCtrlCount(ParticleType type) override; @@ -1623,7 +1625,7 @@ namespace Glitter { void CheckUpdate(float_t delta_frame); bool Copy(EffectInst* eff_inst, Scene* dst); void Ctrl(GPM, float_t delta_frame); - void Disp(GPM, DispType disp_type); + void Disp(GPM, render_data_context& rend_data_ct, DispType disp_type); void DispMesh(GPM); size_t GetCtrlCount(ParticleType ptcl_type); size_t GetDispCount(ParticleType ptcl_type); @@ -1687,7 +1689,7 @@ namespace Glitter { void CheckSceneHasLocalEffect(Scene* sc); void CtrlScenes(); void DecrementInitBuffersByCount(int32_t count = 1); - void DispScenes(DispType disp_type); + void DispScenes(render_data_context& rend_data_ct, DispType disp_type); void FreeEffects(); void FreeSceneEffect(SceneCounter scene_counter, bool force_kill = true); void FreeSceneEffect(uint64_t effect_group_hash, uint64_t effect_hash, bool force_kill = true); diff --git a/src/CRE/Glitter/particle_manager.cpp b/src/CRE/Glitter/particle_manager.cpp index 5a72724a..070ef94a 100644 --- a/src/CRE/Glitter/particle_manager.cpp +++ b/src/CRE/Glitter/particle_manager.cpp @@ -272,7 +272,7 @@ namespace Glitter { init_buffers = max_def(init_buffers - count, 0); } - void GltParticleManager::DispScenes(DispType disp_type) { + void GltParticleManager::DispScenes(render_data_context& rend_data_ctx, DispType disp_type) { if (flags & PARTICLE_MANAGER_NOT_DISP) return; @@ -281,13 +281,13 @@ namespace Glitter { && selected_effect_group != i->effect_group) continue; - i->Disp(this, disp_type); + i->Disp(this, rend_data_ctx, disp_type); } - gl_rend_state.bind_vertex_array(0); - gl_rend_state.disable_blend(); - gl_rend_state.enable_cull_face(); - gl_rend_state.disable_depth_test(); + rend_data_ctx.state.bind_vertex_array(0); + rend_data_ctx.state.disable_blend(); + rend_data_ctx.state.enable_cull_face(); + rend_data_ctx.state.disable_depth_test(); } void GltParticleManager::FreeEffects() { diff --git a/src/CRE/Glitter/render_scene.cpp b/src/CRE/Glitter/render_scene.cpp index 847b7965..9d16b118 100644 --- a/src/CRE/Glitter/render_scene.cpp +++ b/src/CRE/Glitter/render_scene.cpp @@ -908,7 +908,7 @@ namespace Glitter { } } - void F2RenderScene::Disp(GPM, DispType disp_type) { + void F2RenderScene::Disp(GPM, render_data_context& rend_data_ctx, DispType disp_type) { Effect* eff = GPM_VAL->selected_effect; Emitter* emit = GPM_VAL->selected_emitter; Particle* ptcl = GPM_VAL->selected_particle; @@ -922,11 +922,11 @@ namespace Glitter { continue; if (!GPM_VAL->draw_selected || !eff) { - Disp(GPM_VAL, rend_group); + Disp(GPM_VAL, rend_data_ctx, rend_group); } else if ((eff && ptcl) || (eff && !emit)) { if (!ptcl || rend_group->particle->particle == ptcl) - Disp(GPM_VAL, rend_group); + Disp(GPM_VAL, rend_data_ctx, rend_group); } else if (emit) for (Particle*& j : emit->particles) { @@ -935,12 +935,12 @@ namespace Glitter { Particle* particle = j; if (rend_group->particle->particle == particle) - Disp(GPM_VAL, rend_group); + Disp(GPM_VAL, rend_data_ctx, rend_group); } } } - void F2RenderScene::Disp(GPM, F2RenderGroup* rend_group) { + void F2RenderScene::Disp(GPM, render_data_context& rend_data_ctx, F2RenderGroup* rend_group) { switch (rend_group->type) { case PARTICLE_QUAD: case PARTICLE_LINE: @@ -970,7 +970,7 @@ namespace Glitter { shader_data.g_glitter_blend_color = 1.0f; shader_data.g_state_material_diffuse = 0.0f; shader_data.g_state_material_emission = { emission, emission, emission, 1.0f }; - rctx_ptr->glitter_batch_ubo.WriteMemory(shader_data); + rctx_ptr->glitter_batch_ubo.WriteMemory(rend_data_ctx.state, shader_data); GLenum blend_src; GLenum blend_dst; @@ -995,8 +995,8 @@ namespace Glitter { break; } - gl_rend_state.set_blend_func(blend_src, blend_dst); - gl_rend_state.set_blend_equation(GL_FUNC_ADD); + rend_data_ctx.state.set_blend_func(blend_src, blend_dst); + rend_data_ctx.state.set_blend_equation(GL_FUNC_ADD); GLuint texture = rctx_ptr->empty_texture_2d->glid; GLuint mask_texture = rctx_ptr->empty_texture_2d->glid; @@ -1005,117 +1005,116 @@ namespace Glitter { if (rend_group->mask_texture) { mask_texture = rend_group->mask_texture; - uniform_value[U_TEXTURE_COUNT] = 2; + rend_data_ctx.shader_flags.arr[U_TEXTURE_COUNT] = 2; switch (rend_group->mask_blend_mode) { default: - uniform_value[U_TEXTURE_BLEND] = 0; + rend_data_ctx.shader_flags.arr[U_TEXTURE_BLEND] = 0; break; case PARTICLE_BLEND_MULTIPLY: - uniform_value[U_TEXTURE_BLEND] = 1; + rend_data_ctx.shader_flags.arr[U_TEXTURE_BLEND] = 1; break; case PARTICLE_BLEND_ADD: - uniform_value[U_TEXTURE_BLEND] = 2; + rend_data_ctx.shader_flags.arr[U_TEXTURE_BLEND] = 2; break; } } else { - uniform_value[U_TEXTURE_COUNT] = 1; - uniform_value[U_TEXTURE_BLEND] = 0; + rend_data_ctx.shader_flags.arr[U_TEXTURE_COUNT] = 1; + rend_data_ctx.shader_flags.arr[U_TEXTURE_BLEND] = 0; } } else { - uniform_value[U_TEXTURE_COUNT] = 0; - uniform_value[U_TEXTURE_BLEND] = 0; + rend_data_ctx.shader_flags.arr[U_TEXTURE_COUNT] = 0; + rend_data_ctx.shader_flags.arr[U_TEXTURE_BLEND] = 0; } - gl_rend_state.active_bind_texture_2d(0, texture); - gl_rend_state.active_bind_texture_2d(1, mask_texture); + rend_data_ctx.state.active_bind_texture_2d(0, texture); + rend_data_ctx.state.active_bind_texture_2d(1, mask_texture); switch (rend_group->type) { case PARTICLE_QUAD: switch (rend_group->fog_type) { default: - uniform_value[U_FOG_STAGE] = 0; + rend_data_ctx.shader_flags.arr[U_FOG_STAGE] = 0; break; case Glitter::FOG_DEPTH: - uniform_value[U_FOG_STAGE] = 1; + rend_data_ctx.shader_flags.arr[U_FOG_STAGE] = 1; break; case Glitter::FOG_HEIGHT: - uniform_value[U_FOG_STAGE] = 2; + rend_data_ctx.shader_flags.arr[U_FOG_STAGE] = 2; break; } - gl_rend_state.enable_depth_test(); + rend_data_ctx.state.enable_depth_test(); if (alpha_test) { - uniform_value[U_ALPHA_TEST] = 1; - rctx_ptr->set_batch_alpha_threshold(0.5f); - uniform_value[U_ALPHA_BLEND] = 1; - gl_rend_state.set_depth_mask(GL_TRUE); - gl_rend_state.disable_blend(); + rend_data_ctx.shader_flags.arr[U_ALPHA_TEST] = 1; + rend_data_ctx.set_batch_alpha_threshold(0.5f); + rend_data_ctx.shader_flags.arr[U_ALPHA_BLEND] = 1; + rend_data_ctx.state.set_depth_mask(GL_TRUE); + rend_data_ctx.state.disable_blend(); } else if (rend_group->disp_type) { - uniform_value[U_ALPHA_TEST] = 0; - uniform_value[U_ALPHA_BLEND] = 2; - gl_rend_state.set_depth_mask(GL_FALSE); - gl_rend_state.enable_blend(); + rend_data_ctx.shader_flags.arr[U_ALPHA_TEST] = 0; + rend_data_ctx.shader_flags.arr[U_ALPHA_BLEND] = 2; + rend_data_ctx.state.set_depth_mask(GL_FALSE); + rend_data_ctx.state.enable_blend(); } else { - uniform_value[U_ALPHA_TEST] = 0; - uniform_value[U_ALPHA_BLEND] = 0; - gl_rend_state.set_depth_mask(GL_TRUE); - gl_rend_state.disable_blend(); + rend_data_ctx.shader_flags.arr[U_ALPHA_TEST] = 0; + rend_data_ctx.shader_flags.arr[U_ALPHA_BLEND] = 0; + rend_data_ctx.state.set_depth_mask(GL_TRUE); + rend_data_ctx.state.disable_blend(); } if (rend_group->draw_type == DIRECTION_BILLBOARD) { - gl_rend_state.enable_cull_face(); - gl_rend_state.set_cull_face_mode(GL_BACK); + rend_data_ctx.state.enable_cull_face(); + rend_data_ctx.state.set_cull_face_mode(GL_BACK); } else - gl_rend_state.disable_cull_face(); + rend_data_ctx.state.disable_cull_face(); break; case PARTICLE_LINE: - uniform_value[U_ALPHA_TEST] = 0; - uniform_value[U_ALPHA_BLEND] = 2; - uniform_value[U_FOG_STAGE] = 0; + rend_data_ctx.shader_flags.arr[U_ALPHA_TEST] = 0; + rend_data_ctx.shader_flags.arr[U_ALPHA_BLEND] = 2; + rend_data_ctx.shader_flags.arr[U_FOG_STAGE] = 0; - gl_rend_state.enable_depth_test(); - gl_rend_state.set_depth_mask(GL_FALSE); - gl_rend_state.enable_blend(); - gl_rend_state.enable_cull_face(); - gl_rend_state.set_cull_face_mode(GL_BACK); + rend_data_ctx.state.enable_depth_test(); + rend_data_ctx.state.set_depth_mask(GL_FALSE); + rend_data_ctx.state.enable_blend(); + rend_data_ctx.state.enable_cull_face(); + rend_data_ctx.state.set_cull_face_mode(GL_BACK); break; case PARTICLE_LOCUS: - uniform_value[U_ALPHA_TEST] = 0; - uniform_value[U_ALPHA_BLEND] = 2; - uniform_value[U_FOG_STAGE] = 0; + rend_data_ctx.shader_flags.arr[U_ALPHA_TEST] = 0; + rend_data_ctx.shader_flags.arr[U_ALPHA_BLEND] = 2; + rend_data_ctx.shader_flags.arr[U_FOG_STAGE] = 0; - gl_rend_state.enable_depth_test(); - gl_rend_state.set_depth_mask(GL_FALSE); - gl_rend_state.enable_blend(); - gl_rend_state.disable_cull_face(); + rend_data_ctx.state.enable_depth_test(); + rend_data_ctx.state.set_depth_mask(GL_FALSE); + rend_data_ctx.state.enable_blend(); + rend_data_ctx.state.disable_cull_face(); break; } - shaders_ft.set(SHADER_FT_GLITTER_PT); - rctx_ptr->set_glitter_render_data(); - rctx_ptr->glitter_batch_ubo.Bind(3); + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_GLITTER_PT); + rend_data_ctx.set_glitter_render_data_state(); + rend_data_ctx.state.bind_uniform_buffer_base(3, rctx_ptr->glitter_batch_ubo); switch (rend_group->type) { case PARTICLE_QUAD: - gl_rend_state.bind_vertex_array(rend_group->vao); - shaders_ft.enable_primitive_restart(); - shaders_ft.draw_elements(GL_TRIANGLE_STRIP, (GLsizei)(5 * rend_group->disp - 1), GL_UNSIGNED_INT, 0); - shaders_ft.disable_primitive_restart(); + rend_data_ctx.state.bind_vertex_array(rend_group->vao); + rend_data_ctx.state.draw_elements(GL_TRIANGLE_STRIP, + (GLsizei)(5 * rend_group->disp - 1), GL_UNSIGNED_INT, 0); break; case PARTICLE_LINE: - gl_rend_state.bind_vertex_array(rend_group->vao); + rend_data_ctx.state.bind_vertex_array(rend_group->vao); for (std::pair& i : rend_group->draw_list) - shaders_ft.draw_arrays(GL_LINE_STRIP, i.first, i.second); + rend_data_ctx.state.draw_arrays(GL_LINE_STRIP, i.first, i.second); break; case PARTICLE_LOCUS: - gl_rend_state.bind_vertex_array(rend_group->vao); + rend_data_ctx.state.bind_vertex_array(rend_group->vao); for (std::pair& i : rend_group->draw_list) - shaders_ft.draw_arrays(GL_TRIANGLE_STRIP, i.first, i.second); + rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, i.first, i.second); break; } } @@ -1884,7 +1883,7 @@ namespace Glitter { } } - void XRenderScene::Disp(GPM, DispType disp_type) { + void XRenderScene::Disp(GPM, render_data_context& rend_data_ctx, DispType disp_type) { Effect* eff = GPM_VAL->selected_effect; Emitter* emit = GPM_VAL->selected_emitter; Particle* ptcl = GPM_VAL->selected_particle; @@ -1897,11 +1896,11 @@ namespace Glitter { continue; if (!GPM_VAL->draw_selected || !eff) { - Disp(GPM_VAL, rend_group); + Disp(GPM_VAL, rend_data_ctx, rend_group); } else if ((eff && ptcl) || (eff && !emit)) { if (!ptcl || rend_group->particle->particle == ptcl) - Disp(GPM_VAL, rend_group); + Disp(GPM_VAL, rend_data_ctx, rend_group); } else if (emit) for (Particle*& j : emit->particles) { @@ -1910,12 +1909,12 @@ namespace Glitter { Particle* particle = j; if (rend_group->particle->particle == particle) - Disp(GPM_VAL, rend_group); + Disp(GPM_VAL, rend_data_ctx, rend_group); } } } - void XRenderScene::Disp(GPM, XRenderGroup* rend_group) { + void XRenderScene::Disp(GPM, render_data_context& rend_data_ctx, XRenderGroup* rend_group) { switch (rend_group->type) { case PARTICLE_QUAD: case PARTICLE_LINE: @@ -1950,7 +1949,7 @@ namespace Glitter { shader_data.g_glitter_blend_color = 1.0f; shader_data.g_state_material_diffuse = 0.0f; shader_data.g_state_material_emission = { emission, emission, emission, 1.0f }; - rctx_ptr->glitter_batch_ubo.WriteMemory(shader_data); + rctx_ptr->glitter_batch_ubo.WriteMemory(rend_data_ctx.state, shader_data); GLenum blend_src; GLenum blend_dst; @@ -1975,8 +1974,8 @@ namespace Glitter { break; } - gl_rend_state.set_blend_func(blend_src, blend_dst); - gl_rend_state.set_blend_equation(GL_FUNC_ADD); + rend_data_ctx.state.set_blend_func(blend_src, blend_dst); + rend_data_ctx.state.set_blend_equation(GL_FUNC_ADD); GLuint texture = rctx_ptr->empty_texture_2d->glid; GLuint mask_texture = rctx_ptr->empty_texture_2d->glid; @@ -1985,95 +1984,94 @@ namespace Glitter { if (rend_group->mask_texture) { mask_texture = rend_group->mask_texture; - uniform_value[U_TEXTURE_COUNT] = 2; + rend_data_ctx.shader_flags.arr[U_TEXTURE_COUNT] = 2; switch (rend_group->mask_blend_mode) { default: - uniform_value[U_TEXTURE_BLEND] = 0; + rend_data_ctx.shader_flags.arr[U_TEXTURE_BLEND] = 0; break; case PARTICLE_BLEND_MULTIPLY: - uniform_value[U_TEXTURE_BLEND] = 1; + rend_data_ctx.shader_flags.arr[U_TEXTURE_BLEND] = 1; break; case PARTICLE_BLEND_ADD: - uniform_value[U_TEXTURE_BLEND] = 2; + rend_data_ctx.shader_flags.arr[U_TEXTURE_BLEND] = 2; break; } } else { - uniform_value[U_TEXTURE_COUNT] = 1; - uniform_value[U_TEXTURE_BLEND] = 0; + rend_data_ctx.shader_flags.arr[U_TEXTURE_COUNT] = 1; + rend_data_ctx.shader_flags.arr[U_TEXTURE_BLEND] = 0; } } else { - uniform_value[U_TEXTURE_COUNT] = 0; - uniform_value[U_TEXTURE_BLEND] = 0; + rend_data_ctx.shader_flags.arr[U_TEXTURE_COUNT] = 0; + rend_data_ctx.shader_flags.arr[U_TEXTURE_BLEND] = 0; } - gl_rend_state.active_bind_texture_2d(0, texture); - gl_rend_state.active_bind_texture_2d(1, mask_texture); + rend_data_ctx.state.active_bind_texture_2d(0, texture); + rend_data_ctx.state.active_bind_texture_2d(1, mask_texture); switch (rend_group->fog_type) { default: - uniform_value[U_FOG_STAGE] = 0; + rend_data_ctx.shader_flags.arr[U_FOG_STAGE] = 0; break; case Glitter::FOG_DEPTH: - uniform_value[U_FOG_STAGE] = 1; + rend_data_ctx.shader_flags.arr[U_FOG_STAGE] = 1; break; case Glitter::FOG_HEIGHT: - uniform_value[U_FOG_STAGE] = 2; + rend_data_ctx.shader_flags.arr[U_FOG_STAGE] = 2; break; } if (!(rend_group->flags & PARTICLE_DEPTH_TEST)) - gl_rend_state.enable_depth_test(); + rend_data_ctx.state.enable_depth_test(); else - gl_rend_state.disable_depth_test(); + rend_data_ctx.state.disable_depth_test(); if (alpha_test) { - uniform_value[U_ALPHA_TEST] = 1; - rctx_ptr->set_batch_alpha_threshold(0.5f); - uniform_value[U_ALPHA_BLEND] = rend_group->disp_type ? 3 : 1; - gl_rend_state.set_depth_mask(GL_TRUE); - gl_rend_state.disable_blend(); + rend_data_ctx.shader_flags.arr[U_ALPHA_TEST] = 1; + rend_data_ctx.set_batch_alpha_threshold(0.5f); + rend_data_ctx.shader_flags.arr[U_ALPHA_BLEND] = rend_group->disp_type ? 3 : 1; + rend_data_ctx.state.set_depth_mask(GL_TRUE); + rend_data_ctx.state.disable_blend(); } else if (rend_group->disp_type) { - uniform_value[U_ALPHA_TEST] = 0; - uniform_value[U_ALPHA_BLEND] = 2; - gl_rend_state.set_depth_mask(GL_FALSE); - gl_rend_state.enable_blend(); + rend_data_ctx.shader_flags.arr[U_ALPHA_TEST] = 0; + rend_data_ctx.shader_flags.arr[U_ALPHA_BLEND] = 2; + rend_data_ctx.state.set_depth_mask(GL_FALSE); + rend_data_ctx.state.enable_blend(); } else { - uniform_value[U_ALPHA_TEST] = 0; - uniform_value[U_ALPHA_BLEND] = 0; - gl_rend_state.set_depth_mask(GL_TRUE); - gl_rend_state.disable_blend(); + rend_data_ctx.shader_flags.arr[U_ALPHA_TEST] = 0; + rend_data_ctx.shader_flags.arr[U_ALPHA_BLEND] = 0; + rend_data_ctx.state.set_depth_mask(GL_TRUE); + rend_data_ctx.state.disable_blend(); } if (rend_group->draw_type == DIRECTION_BILLBOARD && !rend_group->use_culling) { - gl_rend_state.enable_cull_face(); - gl_rend_state.set_cull_face_mode(GL_BACK); + rend_data_ctx.state.enable_cull_face(); + rend_data_ctx.state.set_cull_face_mode(GL_BACK); } else - gl_rend_state.disable_cull_face(); + rend_data_ctx.state.disable_cull_face(); - shaders_ft.set(SHADER_FT_GLITTER_PT); - rctx_ptr->set_glitter_render_data(); - rctx_ptr->glitter_batch_ubo.Bind(3); + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_GLITTER_PT); + rend_data_ctx.set_glitter_render_data_state(); + rend_data_ctx.state.bind_uniform_buffer_base(3, rctx_ptr->glitter_batch_ubo); switch (rend_group->type) { case PARTICLE_QUAD: - gl_rend_state.bind_vertex_array(rend_group->vao); - shaders_ft.enable_primitive_restart(); - shaders_ft.draw_elements(GL_TRIANGLE_STRIP, (GLsizei)(5 * rend_group->disp - 1), GL_UNSIGNED_INT, 0); - shaders_ft.disable_primitive_restart(); + rend_data_ctx.state.bind_vertex_array(rend_group->vao); + rend_data_ctx.state.draw_elements(GL_TRIANGLE_STRIP, + (GLsizei)(5 * rend_group->disp - 1), GL_UNSIGNED_INT, 0); break; case PARTICLE_LINE: - gl_rend_state.bind_vertex_array(rend_group->vao); + rend_data_ctx.state.bind_vertex_array(rend_group->vao); for (std::pair& i : rend_group->draw_list) - shaders_ft.draw_arrays(GL_LINE_STRIP, i.first, i.second); + rend_data_ctx.state.draw_arrays(GL_LINE_STRIP, i.first, i.second); break; case PARTICLE_LOCUS: - gl_rend_state.bind_vertex_array(rend_group->vao); + rend_data_ctx.state.bind_vertex_array(rend_group->vao); for (std::pair& i : rend_group->draw_list) - shaders_ft.draw_arrays(GL_TRIANGLE_STRIP, i.first, i.second); + rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, i.first, i.second); break; } } diff --git a/src/CRE/Glitter/scene.cpp b/src/CRE/Glitter/scene.cpp index 5299d3e7..74aaf840 100644 --- a/src/CRE/Glitter/scene.cpp +++ b/src/CRE/Glitter/scene.cpp @@ -4,6 +4,7 @@ */ #include "glitter.hpp" +#include "../gl_state.hpp" namespace Glitter { Scene::Scene(SceneCounter counter, uint64_t hash, EffectGroup* eff_group, bool a5) { @@ -78,7 +79,7 @@ namespace Glitter { } if (disp) - effect_group->vbo.WriteMemory(0, effect_group->max_count * sizeof(Buffer), effect_group->buffer); + effect_group->vbo.WriteMemory(gl_state, 0, effect_group->max_count * sizeof(Buffer), effect_group->buffer); #endif } @@ -163,7 +164,7 @@ namespace Glitter { } } - void Scene::Disp(GPM, DispType disp_type) { + void Scene::Disp(GPM, render_data_context& rend_data_ctx, DispType disp_type) { if (flags & SCENE_NOT_DISP) return; @@ -173,7 +174,7 @@ namespace Glitter { && GPM_VAL->selected_effect != i.ptr->effect) continue; - i.ptr->Disp(GPM_VAL, disp_type); + i.ptr->Disp(GPM_VAL, rend_data_ctx, disp_type); } } diff --git a/src/CRE/Vulkan/gl_wrap.cpp b/src/CRE/Vulkan/gl_wrap.cpp index da84bd2c..25c16cc9 100644 --- a/src/CRE/Vulkan/gl_wrap.cpp +++ b/src/CRE/Vulkan/gl_wrap.cpp @@ -423,14 +423,22 @@ namespace Vulkan { } } - vk_fbo->render_pass[0] = Vulkan::manager_get_render_pass( - color_formats, color_format_count, depth_format, false); - vk_fbo->render_pass[1] = Vulkan::manager_get_render_pass( - color_formats, color_format_count, depth_format, true); - vk_fbo->framebuffer[0].Create(Vulkan::current_device, 0, - *vk_fbo->render_pass[0].get(), image_view_count, image_views, width, height); - vk_fbo->framebuffer[1].Create(Vulkan::current_device, 0, - *vk_fbo->render_pass[1].get(), image_view_count, image_views, width, height); + if (color_format_count || depth_format) { + vk_fbo->render_pass[0] = Vulkan::manager_get_render_pass( + color_formats, color_format_count, depth_format, false); + vk_fbo->render_pass[1] = Vulkan::manager_get_render_pass( + color_formats, color_format_count, depth_format, true); + vk_fbo->framebuffer[0].Create(Vulkan::current_device, 0, + *vk_fbo->render_pass[0].get(), image_view_count, image_views, width, height); + vk_fbo->framebuffer[1].Create(Vulkan::current_device, 0, + *vk_fbo->render_pass[1].get(), image_view_count, image_views, width, height); + } + else { + vk_fbo->render_pass[0].reset(); + vk_fbo->render_pass[1].reset(); + vk_fbo->framebuffer[0].Destroy(); + vk_fbo->framebuffer[1].Destroy(); + } vk_fbo->update_framebuffer = false; } diff --git a/src/CRE/auth_2d.cpp b/src/CRE/auth_2d.cpp index dcd53fde..967374f3 100644 --- a/src/CRE/auth_2d.cpp +++ b/src/CRE/auth_2d.cpp @@ -8,7 +8,6 @@ #include "auth_2d.hpp" #include "../KKdLib/str_utils.hpp" #include "data.hpp" -#include "file_handler.hpp" #include "sound.hpp" #include "task.hpp" diff --git a/src/CRE/auth_2d.hpp b/src/CRE/auth_2d.hpp index 94867678..fedfe066 100644 --- a/src/CRE/auth_2d.hpp +++ b/src/CRE/auth_2d.hpp @@ -11,6 +11,7 @@ #include "../KKdLib/vec.hpp" #include "color.hpp" #include "frame_rate_control.hpp" +#include "file_handler.hpp" #include "sprite.hpp" enum AetFlags { diff --git a/src/CRE/camera.cpp b/src/CRE/camera.cpp index ef890b89..500105ec 100644 --- a/src/CRE/camera.cpp +++ b/src/CRE/camera.cpp @@ -320,10 +320,10 @@ static void camera_calculate_projection(camera* c) { mat4_mul(&spr_3d_view, &spr_3d_proj, &c->view_projection_aet_3d); extern render_context* rctx_ptr; - rctx_ptr->render.calc_projection_matrix(&c->projection, c->fov, - (float_t)c->aspect, c->min_distance, c->max_distance, - c->proj_left_offset, c->proj_right_offset, - c->proj_left_offset, c->proj_right_offset); + vec2 persp_scale = 1.0f; + vec2 persp_offset = rctx_ptr->render.get_taa_offset(); + mat4_persp_offset(c->fov * DEG_TO_RAD_FLOAT, (float_t)c->aspect, + c->min_distance, c->max_distance, &persp_scale, &persp_offset, &c->projection); mat4_invert(&c->projection, &c->inv_projection); float_t height = (float_t)res_wind_int->height * 0.5f; @@ -404,3 +404,113 @@ void cam_struct::set(camera* cam) { cam->set_up(use_up, up); cam->set_min_distance(min_distance); } + +cam_data::cam_data() : view_point(0.0f, 0.0f, 1.0f), interest(), up(0.0f, 1.0f, 0.0f), + fov(30.0f * DEG_TO_RAD_FLOAT), aspect(4.0f / 3.0f), min_distance(1.0f), max_distance(200.0f), + view_mat(), proj_mat(), view_proj_mat(), persp_scale(), persp_offset() { + +} + +void cam_data::calc_ortho_proj_mat(float_t left, float_t right, + float_t bottom, float_t top, const vec2& scale, const vec2& offset) { + mat4_ortho_offset(left, right, bottom, top, min_distance, max_distance, &scale, &offset, &proj_mat); +} + +void cam_data::calc_persp_proj_mat() { + mat4_persp(fov, aspect, min_distance, max_distance, &proj_mat); + persp_scale = 1.0f; + persp_offset = 0.0f; +} + +void cam_data::calc_persp_proj_mat_offset(const vec2& persp_scale, const vec2& persp_offset) { + mat4_persp_offset(fov, aspect, min_distance, max_distance, &persp_scale, &persp_offset, &proj_mat); + this->persp_scale = persp_scale; + this->persp_offset = persp_offset; +} + +void cam_data::calc_view_mat() { + mat4_look_at(&view_point, &interest, &up, &view_mat); +} + +void cam_data::calc_view_proj_mat() { + mat4_mul(&view_mat, &proj_mat, &view_proj_mat); +} + +void cam_data::get(const camera* cam) { + view_point = cam->view_point; + interest = cam->interest; + up = cam->up; + fov = cam->fov * DEG_TO_RAD_FLOAT; + aspect = (float_t)cam->aspect; + min_distance = cam->min_distance; + max_distance = cam->max_distance; + view_mat = cam->view; + proj_mat = cam->projection; + view_proj_mat = cam->view_projection; + persp_scale = 1.0f; + persp_offset = 0.0f; +} + +float_t cam_data::get_aspect() const { + return aspect; +} + +float_t cam_data::get_fov() const { + return fov; +} + +const vec3& cam_data::get_interest() const { + return interest; +} + +float_t cam_data::get_min_distance() const { + return min_distance; +} + +float_t cam_data::get_max_distance() const { + return max_distance; +} + +const mat4& cam_data::get_proj_mat() const { + return proj_mat; +} + +const mat4& cam_data::get_view_mat() const { + return view_mat; +} + +const vec3& cam_data::get_view_point() const { + return view_point; +} + +const mat4& cam_data::get_view_proj_mat() const { + return view_proj_mat; +} + +void cam_data::set_aspect(float_t value) { + aspect = value; +} + +void cam_data::set_fov(float_t value) { + fov = value; +} + +void cam_data::set_interest(const vec3& value) { + interest = value; +} + +void cam_data::set_min_distance(float_t value) { + min_distance = value; +} + +void cam_data::set_max_distance(float_t value) { + max_distance = value; +} + +void cam_data::set_up(const vec3& value) { + up = value; +} + +void cam_data::set_view_point(const vec3& value) { + view_point = value; +} diff --git a/src/CRE/camera.hpp b/src/CRE/camera.hpp index 58d87304..774180b0 100644 --- a/src/CRE/camera.hpp +++ b/src/CRE/camera.hpp @@ -114,3 +114,44 @@ struct cam_struct { void get(camera* cam); void set(camera* cam); }; + +struct cam_data { + vec3 view_point; + vec3 interest; + vec3 up; + float_t fov; + float_t aspect; + float_t min_distance; + float_t max_distance; + mat4 view_mat; + mat4 proj_mat; + mat4 view_proj_mat; + vec2 persp_scale; + vec2 persp_offset; + + cam_data(); + + void calc_ortho_proj_mat(float_t left, float_t right, + float_t bottom, float_t top, const vec2& scale, const vec2& offset); + void calc_persp_proj_mat(); + void calc_persp_proj_mat_offset(const vec2& persp_scale, const vec2& persp_offset); + void calc_view_mat(); + void calc_view_proj_mat(); + void get(const camera* cam); + float_t get_aspect() const; + float_t get_fov() const; + const vec3& get_interest() const; + float_t get_min_distance() const; + float_t get_max_distance() const; + const mat4& get_proj_mat() const; + const mat4& get_view_mat() const; + const vec3& get_view_point() const; + const mat4& get_view_proj_mat() const; + void set_aspect(float_t value); + void set_fov(float_t value); + void set_interest(const vec3& value); + void set_min_distance(float_t value); + void set_max_distance(float_t value); + void set_up(const vec3& value); + void set_view_point(const vec3& value); +}; diff --git a/src/CRE/clear_color.cpp b/src/CRE/clear_color.cpp index a4c21b8a..d9bdffb6 100644 --- a/src/CRE/clear_color.cpp +++ b/src/CRE/clear_color.cpp @@ -4,7 +4,7 @@ */ #include "clear_color.hpp" -#include "gl_rend_state.hpp" +#include "gl.hpp" color4u8 clear_color; bool set_clear_color; diff --git a/src/CRE/effect.cpp b/src/CRE/effect.cpp index 9a5567b4..26fc887f 100644 --- a/src/CRE/effect.cpp +++ b/src/CRE/effect.cpp @@ -16,6 +16,7 @@ #include "auth_3d.hpp" #include "data.hpp" #include "gl_rend_state.hpp" +#include "gl_state.hpp" #include "random.hpp" #include "render_texture.hpp" #include "render_context.hpp" @@ -215,12 +216,12 @@ struct EffectFogRing { void ctrl_inner(float_t delta_time); void dest(); void disp(); - void draw(); + void draw(render_data_context& rend_data_ctx, const cam_data& cam); void init_particle_data(); void restart_effect(); void set_stage_indices(const std::vector& stage_indices); - static void draw_static(void* data); + static void draw_static(render_data_context& rend_data_ctx, void* data, const cam_data& cam); static float_t ptcl_random(float_t value); void sub_140347B40(float_t delta_time); @@ -419,15 +420,15 @@ struct EffectRipple { void dest(); void disp(); void disp_particles(ripple_struct* data); - void draw(); + void draw(render_data_context& rend_data_ctx, const cam_data& cam); void reset(); void set_stage_index(int32_t stage_index); void set_stage_indices(const std::vector& stage_indices); void set_stage_param(stage_param_ripple* ripple); - static void draw_static(void* data); + static void draw_static(render_data_context& rend_data_ctx, void* data, const cam_data& cam); - void sub_1403584A0(RenderTexture* rt); + void sub_1403584A0(render_data_context& rend_data_ctx, RenderTexture* rt); void sub_140358690(); void sub_1403587C0(const vec3 a2, const vec3 a3, float_t a4, ripple_struct& a5, ripple_struct& a6); void sub_14035AAE0(); @@ -583,7 +584,7 @@ struct water_particle { void ctrl(); void disp(); - void draw(mat4* mat); + void draw(render_data_context& rend_data_ctx, const cam_data& cam, mat4* mat); void free(); void reset(); void set(splash_particle* splash, int32_t splash_tex_id); @@ -874,7 +875,8 @@ struct star_catalog_milky_way { float_t longitude_offset_degs_10, float_t latitude_offset_degs_10); void create_default_sphere(); void delete_buffers(); - void draw(const mat4& vp, const mat4& model, texture* tex, GL::UniformBuffer& scene_ubo); + void draw(render_data_context& rend_data_ctx, + const mat4& vp, const mat4& model, texture* tex, GL::UniformBuffer& scene_ubo); void reset(); }; @@ -912,7 +914,7 @@ struct star_catalog { star_catalog(); ~star_catalog(); - void draw(); + void draw(render_data_context& rend_data_ctx, const cam_data& cam); void free(); bool init(); void set_stage_param_data(stage_param_star* value); @@ -1210,15 +1212,18 @@ static bool effect_array_parse_stage_param_data_snow(stage_param_snow* snow, int static bool effect_array_parse_stage_param_data_splash(stage_param_splash* splash, int32_t stage_index); static bool effect_array_parse_stage_param_data_star(stage_param_star* star, int32_t stage_index); -static void draw_fog_particle(EffectFogRing* data, mat4* mat); +static void draw_fog_particle(render_data_context& rend_data_ctx, + EffectFogRing* data, const cam_data& cam, mat4* mat); -static void draw_ripple_particles(ripple_struct* data, mat4* mat); +static void draw_ripple_particles(render_data_context& rend_data_ctx, + ripple_struct* data, const cam_data& cam, mat4* mat); -static void draw_water_particle(water_particle* data, mat4* mat); +static void draw_water_particle(render_data_context& rend_data_ctx, + water_particle* data, const cam_data& cam, mat4* mat); static void leaf_particle_init(bool change_stage = false); static void leaf_particle_ctrl(); -static int32_t leaf_particle_disp(); +static int32_t leaf_particle_disp(render_data_context& rend_data_ctx); static void leaf_particle_free(); static void particle_init(vec3* offset); @@ -1250,14 +1255,16 @@ static void snow_particle_free(); static void water_particle_init(); static void water_particle_free(); -static void sub_1403B6ED0(RenderTexture* a1, RenderTexture* a2, RenderTexture* a3, ripple_emit_params& params); -static void sub_1403B6F60(texture* a1, texture* a2, texture* a3, ripple_emit_params& params); +static void sub_1403B6ED0(render_data_context& rend_data_ctx, RenderTexture* a1, + RenderTexture* a2, RenderTexture* a3, ripple_emit_params& params); +static void sub_1403B6F60(render_data_context& rend_data_ctx, + texture* a1, texture* a2, texture* a3, ripple_emit_params& params); particle_event_data::particle_event_data() : type(), count(), size(), force() { } -void leaf_particle_draw() { +void leaf_particle_draw(render_data_context& rend_data_ctx, const cam_data& cam) { if (!stage_param_data_leaf_current || !leaf_ptcl_data || !leaf_particle_enable || !stage_param_data_leaf_set) return; @@ -1266,33 +1273,34 @@ void leaf_particle_draw() { if (!tex) return; - int32_t count = leaf_particle_disp(); + int32_t count = leaf_particle_disp(rend_data_ctx); if (!count) return; leaf_particle_scene_shader_data shader_data = {}; mat4 temp; - mat4_transpose(&rctx_ptr->vp_mat, &temp); + mat4_transpose(&cam.view_proj_mat, &temp); shader_data.g_transform[0] = temp.row0; shader_data.g_transform[1] = temp.row1; shader_data.g_transform[2] = temp.row2; shader_data.g_transform[3] = temp.row3; - rctx_ptr->camera->get_view_point(shader_data.g_view_pos); + *(vec3*)&shader_data.g_view_pos = cam.get_view_point(); + shader_data.g_view_pos = 0.0f; shader_data.g_color = stage_param_data_leaf_current->color; - rctx_ptr->get_scene_light(&shader_data.g_light_env_stage_diffuse, + rend_data_ctx.get_scene_light(&shader_data.g_light_env_stage_diffuse, &shader_data.g_light_env_stage_specular, &shader_data.g_lit_dir, &shader_data.g_lit_luce, 0, 0); - leaf_particle_scene_ubo.WriteMemory(shader_data); + leaf_particle_scene_ubo.WriteMemory(rend_data_ctx.state, shader_data); - gl_rend_state.active_bind_texture_2d(0, tex->glid); - shaders_ft.set(SHADER_FT_LEAF_PT); - leaf_particle_scene_ubo.Bind(0); - gl_rend_state.bind_vertex_array(leaf_ptcl_vao); - shaders_ft.draw_elements(GL_TRIANGLES, count / 4 * 6, GL_UNSIGNED_INT, 0); - gl_rend_state.bind_vertex_array(0); + rend_data_ctx.state.active_bind_texture_2d(0, tex->glid); + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_LEAF_PT); + rend_data_ctx.state.bind_uniform_buffer_base(0, leaf_particle_scene_ubo); + rend_data_ctx.state.bind_vertex_array(leaf_ptcl_vao); + rend_data_ctx.state.draw_elements(GL_TRIANGLES, count / 4 * 6, GL_UNSIGNED_INT, 0); + rend_data_ctx.state.bind_vertex_array(0); } -void rain_particle_draw() { +void rain_particle_draw(render_data_context& rend_data_ctx, const cam_data& cam) { if (!stage_param_data_rain_current || !rain_particle_enable || !stage_param_data_rain_set) return; @@ -1309,26 +1317,26 @@ void rain_particle_draw() { rain_particle_scene_shader_data scene_shader_data = {}; mat4 temp; - mat4_transpose(&rctx_ptr->view_mat, &temp); + mat4_transpose(&cam.view_mat, &temp); scene_shader_data.g_view[0] = temp.row0; scene_shader_data.g_view[1] = temp.row1; scene_shader_data.g_view[2] = temp.row2; scene_shader_data.g_view[3] = temp.row3; - mat4_transpose(&rctx_ptr->proj_mat, &temp); + mat4_transpose(&cam.proj_mat, &temp); scene_shader_data.g_proj[0] = temp.row0; scene_shader_data.g_proj[1] = temp.row1; scene_shader_data.g_proj[2] = temp.row2; scene_shader_data.g_proj[3] = temp.row3; scene_shader_data.g_range_scale = { range_scale.x, range_scale.y, range_scale.z, 0.0f }; scene_shader_data.g_range_offset = { range_offset.x, range_offset.y, range_offset.z, 0.0f }; - rain_particle_scene_ubo.WriteMemory(scene_shader_data); + rain_particle_scene_ubo.WriteMemory(rend_data_ctx.state, scene_shader_data); - gl_rend_state.enable_blend(); - gl_rend_state.set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - gl_rend_state.enable_depth_test(); - gl_rend_state.set_depth_mask(GL_FALSE); - gl_rend_state.active_bind_texture_2d(0, tex->glid); - shaders_ft.set(SHADER_FT_RAIN); + rend_data_ctx.state.enable_blend(); + rend_data_ctx.state.set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + rend_data_ctx.state.enable_depth_test(); + rend_data_ctx.state.set_depth_mask(GL_FALSE); + rend_data_ctx.state.active_bind_texture_2d(0, tex->glid); + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_RAIN); float_t tangent_sign = -rain->psize.x; float_t tangent_size = -rain->psize.y * (float_t)(1.0 / 30.0); @@ -1338,10 +1346,10 @@ void rain_particle_draw() { vec4 color = rain->color; float_t color_a = color.w; - rain_particle_scene_ubo.Bind(0); - rain_particle_batch_ubo.Bind(1); - rain_ssbo.Bind(0); - gl_rend_state.bind_vertex_array(rctx_ptr->common_vao); + rend_data_ctx.state.bind_uniform_buffer_base(0, rain_particle_scene_ubo); + rend_data_ctx.state.bind_uniform_buffer_base(1, rain_particle_batch_ubo); + rend_data_ctx.state.bind_shader_storage_buffer_base(0, rain_ssbo); + rend_data_ctx.state.bind_vertex_array(rctx_ptr->common_vao); for (int32_t i = 0; i < 8; i++, first += count) { particle_data& data = rain_ptcl_data[i]; vec3 pos_offset = data.position / range; @@ -1352,26 +1360,26 @@ void rain_particle_draw() { batch_shader_data.g_pos_offset = { pos_offset.x, pos_offset.y, pos_offset.z, 0.075f }; batch_shader_data.g_tangent = { tangent.x, tangent.y, tangent.z, tangent_sign }; batch_shader_data.g_color = color; - rain_particle_batch_ubo.WriteMemory(batch_shader_data); - shaders_ft.draw_arrays(GL_TRIANGLES, first, count); + rain_particle_batch_ubo.WriteMemory(rend_data_ctx.state, batch_shader_data); + rend_data_ctx.state.draw_arrays(GL_TRIANGLES, first, count); } - gl_rend_state.bind_vertex_array(0); - gl_rend_state.active_bind_texture_2d(0, 0); - gl_rend_state.set_depth_mask(GL_TRUE); - gl_rend_state.disable_blend(); + rend_data_ctx.state.bind_vertex_array(0); + rend_data_ctx.state.active_bind_texture_2d(0, 0); + rend_data_ctx.state.set_depth_mask(GL_TRUE); + rend_data_ctx.state.disable_blend(); } -void particle_draw() { +void particle_draw(render_data_context& rend_data_ctx, const cam_data& cam) { if (!ptcl_data) return; - particle_vertex_data* vtx_data = (particle_vertex_data*)ptcl_vbo.MapMemory(); + particle_vertex_data* vtx_data = (particle_vertex_data*)ptcl_vbo.MapMemory(rend_data_ctx.state); if (!vtx_data) return; int32_t count = particle_disp(vtx_data, ptcl_data, ptcl_count); - ptcl_vbo.UnmapMemory(); + ptcl_vbo.UnmapMemory(rend_data_ctx.state); if (!count) return; @@ -1380,7 +1388,7 @@ void particle_draw() { particle_scene_shader_data shader_data = {}; mat4 temp; - mat4_transpose(&rctx_ptr->vp_mat, &temp); + mat4_transpose(&cam.view_proj_mat, &temp); shader_data.g_transform[0] = temp.row0; shader_data.g_transform[1] = temp.row1; shader_data.g_transform[2] = temp.row2; @@ -1388,16 +1396,16 @@ void particle_draw() { rctx_ptr->camera->get_view_point(shader_data.g_view_pos); light_chara.get_diffuse(shader_data.g_light_env_chara_diffuse); light_chara.get_specular(shader_data.g_light_env_chara_specular); - particle_scene_ubo.WriteMemory(shader_data); + particle_scene_ubo.WriteMemory(rend_data_ctx.state, shader_data); - shaders_ft.set(SHADER_FT_PARTICL); - particle_scene_ubo.Bind(0); - gl_rend_state.bind_vertex_array(ptcl_vao); - shaders_ft.draw_arrays(GL_TRIANGLES, 0, count); - gl_rend_state.bind_vertex_array(0); + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_PARTICL); + rend_data_ctx.state.bind_uniform_buffer_base(0, particle_scene_ubo); + rend_data_ctx.state.bind_vertex_array(ptcl_vao); + rend_data_ctx.state.draw_arrays(GL_TRIANGLES, 0, count); + rend_data_ctx.state.bind_vertex_array(0); } -void snow_particle_draw() { +void snow_particle_draw(render_data_context& rend_data_ctx, const cam_data& cam) { if (!stage_param_data_snow_current || !snow_particle_enable || !stage_param_data_snow_set) return; @@ -1406,25 +1414,24 @@ void snow_particle_draw() { return; stage_param_snow* snow = stage_param_data_snow_current; - draw_pass_set_camera(); - gl_rend_state.enable_blend(); - gl_rend_state.set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - gl_rend_state.enable_depth_test(); - gl_rend_state.set_depth_mask(GL_FALSE); + rend_data_ctx.state.enable_blend(); + rend_data_ctx.state.set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + rend_data_ctx.state.enable_depth_test(); + rend_data_ctx.state.set_depth_mask(GL_FALSE); float_t point_attenuation = powf(tanf((float_t)rctx_ptr->camera->get_fov() * 0.5f * DEG_TO_RAD_FLOAT) * 3.4f, 2.0f) * 0.1f; snow_particle_scene_shader_data snow_scene = {}; mat4 temp; - mat4_transpose(&rctx_ptr->vp_mat, &temp); + mat4_transpose(&cam.view_mat, &temp); snow_scene.g_transform[0] = temp.row0; snow_scene.g_transform[1] = temp.row1; snow_scene.g_transform[2] = temp.row2; snow_scene.g_transform[3] = temp.row3; - mat4_transpose(&rctx_ptr->view_mat, &temp); + mat4_transpose(&cam.view_mat, &temp); snow_scene.g_view_world_row2 = temp.row2; snow_scene.g_size_in_projection.x = 1.0f / (float_t)rctx_ptr->render.render_width[0]; snow_scene.g_size_in_projection.y = 1.0f / (float_t)rctx_ptr->render.render_height[0]; @@ -1437,40 +1444,40 @@ void snow_particle_draw() { snow_scene.g_range_offset.x = snow->offset_gpu.x - snow->range_gpu.x * 0.5f; snow_scene.g_range_offset.y = snow->offset_gpu.y; snow_scene.g_range_offset.z = snow->offset_gpu.z - snow->range_gpu.z * 0.5f; - snow_particle_scene_ubo.WriteMemory(snow_scene); + snow_particle_scene_ubo.WriteMemory(rend_data_ctx.state, snow_scene); snow_particle_batch_shader_data snow_batch = {}; snow_batch.g_color = snow->color; snow_batch.start_vertex_location.x = 0; - snow_particle_batch_ubo.WriteMemory(snow_batch); + snow_particle_batch_ubo.WriteMemory(rend_data_ctx.state, snow_batch); - gl_rend_state.active_bind_texture_2d(0, tex->glid); - gl_rend_state.active_bind_texture_2d(1, rctx_ptr->render.rend_texture[0].GetDepthTex()); - gl_rend_state.bind_vertex_array(rctx_ptr->common_vao); + rend_data_ctx.state.active_bind_texture_2d(0, tex->glid); + rend_data_ctx.state.active_bind_texture_2d(1, rctx_ptr->render.rend_texture[0].GetDepthTex()); + rend_data_ctx.state.bind_vertex_array(rctx_ptr->common_vao); - uniform_value[U_SNOW_PARTICLE] = 0; - shaders_ft.set(SHADER_FT_SNOW_PT); - snow_particle_scene_ubo.Bind(0); - snow_particle_batch_ubo.Bind(1); + rend_data_ctx.shader_flags.arr[U_SNOW_PARTICLE] = 0; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_SNOW_PT); + rend_data_ctx.state.bind_uniform_buffer_base(0, snow_particle_scene_ubo); + rend_data_ctx.state.bind_uniform_buffer_base(1, snow_particle_batch_ubo); - snow_ssbo.Bind(0); - shaders_ft.draw_arrays(GL_TRIANGLES, 0, snow->num_snow * 6); + rend_data_ctx.state.bind_shader_storage_buffer_base(0, snow_ssbo); + rend_data_ctx.state.draw_arrays(GL_TRIANGLES, 0, snow->num_snow * 6); - snow_fallen_ssbo.Bind(0); - shaders_ft.draw_arrays(GL_TRIANGLES, 0, (GLsizei)(snow_ptcl_fallen_count * 6)); + rend_data_ctx.state.bind_shader_storage_buffer_base(0, snow_fallen_ssbo); + rend_data_ctx.state.draw_arrays(GL_TRIANGLES, 0, (GLsizei)(snow_ptcl_fallen_count * 6)); - uniform_value[U_SNOW_PARTICLE] = 1; - shaders_ft.set(SHADER_FT_SNOW_PT); - snow_particle_scene_ubo.Bind(0); - snow_particle_batch_ubo.Bind(1); + rend_data_ctx.shader_flags.arr[U_SNOW_PARTICLE] = 1; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_SNOW_PT); + rend_data_ctx.state.bind_uniform_buffer_base(0, snow_particle_scene_ubo); + rend_data_ctx.state.bind_uniform_buffer_base(1, snow_particle_batch_ubo); point_attenuation = powf(tanf((float_t)rctx_ptr->camera->get_fov() * 0.5f * DEG_TO_RAD_FLOAT) * 3.4f, 2.0f) * 0.06f; snow_scene.g_state_point_attenuation = { 0.0f, 0.0f, point_attenuation, 0.0f }; - snow_particle_scene_ubo.WriteMemory(snow_scene); + snow_particle_scene_ubo.WriteMemory(rend_data_ctx.state, snow_scene); - snow_gpu_ssbo.Bind(0); + rend_data_ctx.state.bind_shader_storage_buffer_base(0, snow_gpu_ssbo); int32_t count = snow->num_snow_gpu / 4; count = min_def(count, (int32_t)snow_ptcl_count / 4) * 6; @@ -1485,23 +1492,23 @@ void snow_particle_draw() { snow_batch.g_pos_offset = { pos_offset.x, pos_offset.y, pos_offset.z, 0.0f }; snow_batch.g_color = color; snow_batch.start_vertex_location.x = first; - snow_particle_batch_ubo.WriteMemory(snow_batch); + snow_particle_batch_ubo.WriteMemory(rend_data_ctx.state, snow_batch); - shaders_ft.draw_arrays(GL_TRIANGLES, 0, count); + rend_data_ctx.state.draw_arrays(GL_TRIANGLES, 0, count); first += count; } - gl_rend_state.bind_vertex_array(0); - gl_rend_state.active_bind_texture_2d(1, 0); - gl_rend_state.active_bind_texture_2d(0, 0); + rend_data_ctx.state.bind_vertex_array(0); + rend_data_ctx.state.active_bind_texture_2d(1, 0); + rend_data_ctx.state.active_bind_texture_2d(0, 0); - gl_rend_state.disable_depth_test(); - gl_rend_state.set_depth_mask(GL_TRUE); - gl_rend_state.disable_blend(); + rend_data_ctx.state.disable_depth_test(); + rend_data_ctx.state.set_depth_mask(GL_TRUE); + rend_data_ctx.state.disable_blend(); } -void star_catalog_draw() { - star_catalog_data.draw(); +void star_catalog_draw(render_data_context& rend_data_ctx, const cam_data& cam) { + star_catalog_data.draw(rend_data_ctx, cam); } void effect_init() { @@ -2215,7 +2222,7 @@ void EffectFogRing::calc_vert() { float_t density = this->density; fog_ring_data* ptcl_data = this->ptcl_data; - fog_ring_vertex_data* ptcl_vtx_data = (fog_ring_vertex_data*)ssbo.MapMemory(); + fog_ring_vertex_data* ptcl_vtx_data = (fog_ring_vertex_data*)ssbo.MapMemory(gl_state); if (!ptcl_vtx_data) { num_vtx = 0; return; @@ -2234,7 +2241,7 @@ void EffectFogRing::calc_vert() { ptcl_vtx_data->size = size; } - ssbo.UnmapMemory(); + ssbo.UnmapMemory(gl_state); num_vtx = (int32_t)(num_ptcls * 6LL); } @@ -2277,7 +2284,7 @@ void EffectFogRing::disp() { (mdl::UserArgsFunc)draw_fog_particle, this, mdl::OBJ_TYPE_USER); } -void EffectFogRing::draw() { +void EffectFogRing::draw(render_data_context& rend_data_ctx, const cam_data& cam) { render_context* rctx = rctx_ptr; rctx->draw_state->set_fog_height(false); @@ -2286,15 +2293,15 @@ void EffectFogRing::draw() { rctx->draw_state->set_fog_height(true); RenderTexture& rt = rctx->render_manager->get_render_texture(8); - rt.Bind(); - gl_rend_state.set_viewport(0, 0, + rt.Bind(rend_data_ctx.state); + rend_data_ctx.state.set_viewport(0, 0, rt.color_texture->get_width_align_mip_level(), rt.color_texture->get_height_align_mip_level()); glClearColor(density_offset, density_offset, density_offset, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); if (rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_USER)) - rctx->disp_manager->draw(mdl::OBJ_TYPE_USER); - gl_rend_state.bind_framebuffer(0); + rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_USER, cam); + rend_data_ctx.state.bind_framebuffer(0); rctx->render_manager->set_effect_texture(rt.color_texture); gl_get_error_print(); } @@ -2420,7 +2427,7 @@ void EffectFogRing::set_stage_indices(const std::vector& stage_indices) ptcl_data = new (force_malloc(max_ptcls)) fog_ring_data[max_ptcls]; - ssbo.Create(sizeof(fog_ring_vertex_data) * max_ptcls); + ssbo.Create(gl_state, sizeof(fog_ring_vertex_data) * max_ptcls); init_particle_data(); @@ -2428,8 +2435,8 @@ void EffectFogRing::set_stage_indices(const std::vector& stage_indices) rctx_ptr->render_manager->add_pre_process(0, EffectFogRing::draw_static, this); } -void EffectFogRing::draw_static(void* data) { - ((EffectFogRing*)data)->draw(); +void EffectFogRing::draw_static(render_data_context& rend_data_ctx, void* data, const cam_data& cam) { + ((EffectFogRing*)data)->draw(rend_data_ctx, cam); } float_t EffectFogRing::ptcl_random(float_t value) { @@ -3074,9 +3081,9 @@ void EffectRipple::clear_tex() { } glClearColor(0.0f, 0.0f, 0.0f, v5); - rt->Bind(); + rt->Bind(gl_state); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - gl_rend_state.bind_framebuffer(0); + gl_state.bind_framebuffer(0); } glClearColor(clear_color.x, clear_color.y, clear_color.z, clear_color.w); @@ -3118,11 +3125,11 @@ void EffectRipple::disp_particles(ripple_struct* data) { (mdl::UserArgsFunc)draw_ripple_particles, data, mdl::OBJ_TYPE_USER); } -void EffectRipple::draw() { +void EffectRipple::draw(render_data_context& rend_data_ctx, const cam_data& cam) { if (!stage_set) return; - gl_rend_state.disable_cull_face(); + rend_data_ctx.state.disable_cull_face(); render_context* rctx = rctx_ptr; @@ -3136,24 +3143,23 @@ void EffectRipple::draw() { if (counter >= 3) counter = 0; - rt[(counter + 1) % 3]->Bind(); + rt[(counter + 1) % 3]->Bind(rend_data_ctx.state); - gl_rend_state_rect viewport_rect = gl_rend_state.get_viewport(); + gl_rend_state_rect viewport_rect = rend_data_ctx.state.get_viewport(); int32_t width = rt[0]->GetWidth(); int32_t height = rt[0]->GetHeight(); - gl_rend_state.set_viewport(1, 1, width - 2, height - 2); + rend_data_ctx.state.set_viewport(1, 1, width - 2, height - 2); - draw_pass_set_camera(); glClear(GL_DEPTH_BUFFER_BIT); if (rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_USER)) { - gl_rend_state.active_bind_texture_2d(7, rt[counter % 3]->GetColorTex()); - rctx->disp_manager->draw(mdl::OBJ_TYPE_USER); - gl_rend_state.active_bind_texture_2d(7, 0); + rend_data_ctx.state.active_bind_texture_2d(7, rt[counter % 3]->GetColorTex()); + rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_USER, cam); + rend_data_ctx.state.active_bind_texture_2d(7, 0); } - gl_rend_state.bind_framebuffer(0); + rend_data_ctx.state.bind_framebuffer(0); params.field_8 = 0.0005f; params.field_C = 0.97f; @@ -3162,11 +3168,11 @@ void EffectRipple::draw() { params.field_C = 0.999f; } - sub_1403B6ED0(rt[(counter + 2) % 3], rt[(counter + 1) % 3], rt[counter % 3], params); + sub_1403B6ED0(rend_data_ctx, rt[(counter + 2) % 3], rt[(counter + 1) % 3], rt[counter % 3], params); - gl_rend_state.set_viewport(viewport_rect); + rend_data_ctx.state.set_viewport(viewport_rect); - sub_1403584A0(rt[(counter + 2) % 3]); + sub_1403584A0(rend_data_ctx, rt[(counter + 2) % 3]); this->counter = counter; } @@ -3180,7 +3186,7 @@ void EffectRipple::draw() { update = false; - gl_rend_state.enable_cull_face(); + rend_data_ctx.state.enable_cull_face(); } void EffectRipple::reset() { @@ -3285,11 +3291,11 @@ void EffectRipple::set_stage_param(stage_param_ripple* ripple) { emitter_size = ripple->emitter_size; } -void EffectRipple::draw_static(void* data) { - ((EffectRipple*)data)->draw(); +void EffectRipple::draw_static(render_data_context& rend_data_ctx, void* data, const cam_data& cam) { + ((EffectRipple*)data)->draw(rend_data_ctx, cam); } -void EffectRipple::sub_1403584A0(RenderTexture* rt) { +void EffectRipple::sub_1403584A0(render_data_context& rend_data_ctx, RenderTexture* rt) { if (ripple_tex_id == -1) return; @@ -3298,10 +3304,10 @@ void EffectRipple::sub_1403584A0(RenderTexture* rt) { return; field_BB8.SetColorDepthTextures(ripple_tex->glid); - field_BB8.Bind(); + field_BB8.Bind(rend_data_ctx.state); - image_filter_scale(&field_BB8, rt->color_texture); - gl_rend_state.bind_framebuffer(0); + image_filter_scale(rend_data_ctx, &field_BB8, rt->color_texture); + rend_data_ctx.state.bind_framebuffer(0); } void EffectRipple::sub_140358690() { @@ -4055,22 +4061,22 @@ void water_particle::disp() { } } -void water_particle::draw(mat4* mat) { +void water_particle::draw(render_data_context& rend_data_ctx, const cam_data& cam, mat4* mat) { if (count <= 0) return; - ssbo.WriteMemory(0, sizeof(water_particle_vertex_data) * count, ptcl_data.data()); + ssbo.WriteMemory(rend_data_ctx.state, 0, sizeof(water_particle_vertex_data) * count, ptcl_data.data()); water_particle_scene_shader_data scene_shader_data = {}; mat4 temp; - mat4_mul(mat, &rctx_ptr->vp_mat, &temp); + mat4_mul(mat, &cam.view_proj_mat, &temp); mat4_transpose(&temp, &temp); scene_shader_data.g_transform[0] = temp.row0; scene_shader_data.g_transform[1] = temp.row1; scene_shader_data.g_transform[2] = temp.row2; scene_shader_data.g_transform[3] = temp.row3; - mat4_mul(mat, &rctx_ptr->view_mat, &temp); + mat4_mul(mat, &cam.view_mat, &temp); mat4_transpose(&temp, &temp); scene_shader_data.g_view_world_row2 = temp.row2; @@ -4079,22 +4085,22 @@ void water_particle::draw(mat4* mat) { scene_shader_data.g_size_in_projection.y = (float_t)(1.0 / 720.0); scene_shader_data.g_size_in_projection.z = 1.0; scene_shader_data.g_size_in_projection.w = 60.0; - water_particle_scene_ubo.WriteMemory(scene_shader_data); + water_particle_scene_ubo.WriteMemory(rend_data_ctx.state, scene_shader_data); - gl_rend_state.disable_cull_face(); - shaders_ft.set(SHADER_FT_W_PTCL); + rend_data_ctx.state.disable_cull_face(); + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_W_PTCL); - gl_rend_state.bind_vertex_array(rctx_ptr->common_vao); - water_particle_scene_ubo.Bind(0); - ssbo.Bind(0); + rend_data_ctx.state.bind_vertex_array(rctx_ptr->common_vao); + rend_data_ctx.state.bind_uniform_buffer_base(0, water_particle_scene_ubo); + rend_data_ctx.state.bind_shader_storage_buffer_base(0, ssbo); texture* tex = texture_manager_get_texture(splash_tex_id); if (tex) - gl_rend_state.active_bind_texture_2d(0, tex->glid); - shaders_ft.draw_arrays(GL_TRIANGLES, 0, count * 6); - gl_rend_state.bind_vertex_array(0); + rend_data_ctx.state.active_bind_texture_2d(0, tex->glid); + rend_data_ctx.state.draw_arrays(GL_TRIANGLES, 0, count * 6); + rend_data_ctx.state.bind_vertex_array(0); - shader::unbind(); - gl_rend_state.enable_cull_face(); + shader::unbind(rend_data_ctx.state); + rend_data_ctx.state.enable_cull_face(); } void water_particle::free() { @@ -4141,7 +4147,7 @@ void water_particle::set(splash_particle* splash, int32_t splash_tex_id) { ripple.position = position_data.data(); ripple.color = color_data.data(); - ssbo.Create(sizeof(water_particle_vertex_data) * splash_count); + ssbo.Create(gl_state, sizeof(water_particle_vertex_data) * splash_count); } ParticleDispObj::ParticleDispObj() : splash() { @@ -4942,10 +4948,10 @@ void star_catalog_milky_way::create_buffers(int32_t subdivs, float_t uv_rec_scal if (!vao) glGenVertexArrays(1, &vao); - vbo.Create((size_t)buffer_size * vtx_count, vtx_data); - glBindBuffer(GL_ARRAY_BUFFER, vbo); + vbo.Create(gl_state, (size_t)buffer_size * vtx_count, vtx_data); + gl_state.bind_array_buffer(vbo); - glBindVertexArray(vao); + gl_state.bind_vertex_array(vao); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, buffer_size, (void*)offsetof(star_catalog_vertex, position)); @@ -4953,12 +4959,12 @@ void star_catalog_milky_way::create_buffers(int32_t subdivs, float_t uv_rec_scal glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, buffer_size, (void*)offsetof(star_catalog_vertex, texcoord)); - ebo.Create(sizeof(uint16_t) * ebo_count, ebo_data); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo); + ebo.Create(gl_state, sizeof(uint16_t) * ebo_count, ebo_data); + gl_state.bind_element_array_buffer(ebo); - glBindVertexArray(0); - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + gl_state.bind_vertex_array(0); + gl_state.bind_array_buffer(0); + gl_state.bind_element_array_buffer(0); free_def(vtx_data); free_def(ebo_data); @@ -4990,7 +4996,8 @@ void star_catalog_milky_way::delete_buffers() { } } -void star_catalog_milky_way::draw(const mat4& vp, const mat4& mat, texture* tex, GL::UniformBuffer& scene_ubo) { +void star_catalog_milky_way::draw(render_data_context& rend_data_ctx, + const mat4& vp, const mat4& mat, texture* tex, GL::UniformBuffer& scene_ubo) { if (!vao) return; @@ -5032,29 +5039,29 @@ void star_catalog_milky_way::draw(const mat4& vp, const mat4& mat, texture* tex, scene_shader_data.g_transform[1] = temp.row1; scene_shader_data.g_transform[2] = temp.row2; scene_shader_data.g_transform[3] = temp.row3; - scene_ubo.WriteMemory(scene_shader_data); + scene_ubo.WriteMemory(rend_data_ctx.state, scene_shader_data); - gl_rend_state.enable_cull_face(); - gl_rend_state.disable_blend(); - gl_rend_state.set_depth_mask(GL_FALSE); - gl_rend_state.active_bind_texture_2d(0, tex->glid); - gl_rend_state.bind_sampler(0, sampler); - gl_rend_state.enable_primitive_restart(); - gl_rend_state.set_primitive_restart_index(restart_index); - uniform_value[U_STAR] = 1; - shaders_ft.set(SHADER_FT_STAR); + rend_data_ctx.state.enable_cull_face(); + rend_data_ctx.state.disable_blend(); + rend_data_ctx.state.set_depth_mask(GL_FALSE); + rend_data_ctx.state.active_bind_texture_2d(0, tex->glid); + rend_data_ctx.state.bind_sampler(0, sampler); + rend_data_ctx.state.enable_primitive_restart(); + rend_data_ctx.state.set_primitive_restart_index(restart_index); + rend_data_ctx.shader_flags.arr[U_STAR] = 1; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_STAR); - gl_rend_state.bind_vertex_array(vao); - scene_ubo.Bind(0); - shaders_ft.draw_elements(GL_TRIANGLE_STRIP, idx_count, GL_UNSIGNED_SHORT, 0); - gl_rend_state.bind_vertex_array(0); + rend_data_ctx.state.bind_vertex_array(vao); + rend_data_ctx.state.bind_uniform_buffer_base(0, scene_ubo); + rend_data_ctx.state.draw_elements(GL_TRIANGLE_STRIP, idx_count, GL_UNSIGNED_SHORT, 0); + rend_data_ctx.state.bind_vertex_array(0); - gl_rend_state.bind_sampler(0, 0); - gl_rend_state.active_bind_texture_2d(0, 0); - gl_rend_state.disable_primitive_restart(); - gl_rend_state.set_depth_mask(GL_TRUE); - gl_rend_state.enable_blend(); - gl_rend_state.disable_cull_face(); + rend_data_ctx.state.bind_sampler(0, 0); + rend_data_ctx.state.active_bind_texture_2d(0, 0); + rend_data_ctx.state.disable_primitive_restart(); + rend_data_ctx.state.set_depth_mask(GL_TRUE); + rend_data_ctx.state.enable_blend(); + rend_data_ctx.state.disable_cull_face(); } void star_catalog_milky_way::reset() { @@ -5084,7 +5091,7 @@ star_catalog::~star_catalog() { free(); } -void star_catalog::draw() { +void star_catalog::draw(render_data_context& rend_data_ctx, const cam_data& cam) { if (!stage_param_data_ptr || !enable || scene_ubo.IsNull() || batch_ubo.IsNull()) return; @@ -5100,23 +5107,23 @@ void star_catalog::draw() { stage_param_data.utc, stage_param_data.rotation_y_deg * DEG_TO_RAD_FLOAT); - const mat4& view = rctx_ptr->view_mat; + const mat4& view = cam.view_mat; model.row3.x = vec3::dot(-*(vec3*)&view.row0, *(vec3*)&view.row3) + model.row3.x; model.row3.y = vec3::dot(-*(vec3*)&view.row1, *(vec3*)&view.row3) + model.row3.y; model.row3.z = vec3::dot(-*(vec3*)&view.row2, *(vec3*)&view.row3) + model.row3.z; - mat4 proj = rctx_ptr->proj_mat; + mat4 proj = cam.proj_mat; proj.row0.z = proj.row0.w; proj.row1.z = proj.row1.w; proj.row2.z = proj.row2.w; proj.row3.z = proj.row3.w; mat4 vp; - mat4_mul(&rctx_ptr->view_mat, &proj, &vp); + mat4_mul(&cam.view_mat, &proj, &vp); texture* milky_way_tex = texture_manager_get_texture(milky_way_tex_id); if (milky_way_tex) - milky_way.draw(vp, model, milky_way_tex, scene_ubo); + milky_way.draw(rend_data_ctx, vp, model, milky_way_tex, scene_ubo); star_catalog_scene_shader_data scene_shader_data = {}; mat4 temp; @@ -5126,15 +5133,15 @@ void star_catalog::draw() { scene_shader_data.g_transform[1] = temp.row1; scene_shader_data.g_transform[2] = temp.row2; scene_shader_data.g_transform[3] = temp.row3; - scene_ubo.WriteMemory(scene_shader_data); + scene_ubo.WriteMemory(rend_data_ctx.state, scene_shader_data); - uniform_value[U_STAR] = 0; - shaders_ft.set(SHADER_FT_STAR); - gl_rend_state.enable_blend(); - gl_rend_state.set_blend_func(GL_ONE, GL_ONE); - gl_rend_state.enable_depth_test(); - gl_rend_state.set_depth_mask(false); - gl_rend_state.bind_vertex_array(rctx_ptr->common_vao); + rend_data_ctx.shader_flags.arr[U_STAR] = 0; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_STAR); + rend_data_ctx.state.enable_blend(); + rend_data_ctx.state.set_blend_func(GL_ONE, GL_ONE); + rend_data_ctx.state.enable_depth_test(); + rend_data_ctx.state.set_depth_mask(false); + rend_data_ctx.state.bind_vertex_array(rctx_ptr->common_vao); for (int32_t i = 0; i < 2; i++) { stage_param_star_modifiers& modifiers = stage_param_data.modifiers[i]; @@ -5147,22 +5154,22 @@ void star_catalog::draw() { modifiers.pos_scale, modifiers.pos_scale * modifiers.offset_scale }; batch_shader_data.g_thresholds = { modifiers.threshold * modifiers.pos_scale, 0.0f, 0.0f, 0.0f }; - batch_ubo.WriteMemory(batch_shader_data); + batch_ubo.WriteMemory(rend_data_ctx.state, batch_shader_data); - scene_ubo.Bind(0); - batch_ubo.Bind(1); - stars_ssbo.Bind(0); + rend_data_ctx.state.bind_uniform_buffer_base(0, scene_ubo); + rend_data_ctx.state.bind_uniform_buffer_base(1, batch_ubo); + rend_data_ctx.state.bind_shader_storage_buffer_base(0, stars_ssbo); if (i) { - gl_rend_state.active_bind_texture_2d(0, star_b_tex->glid); - shaders_ft.draw_arrays(GL_TRIANGLES, 0, star_b_count * 6); + rend_data_ctx.state.active_bind_texture_2d(0, star_b_tex->glid); + rend_data_ctx.state.draw_arrays(GL_TRIANGLES, 0, star_b_count * 6); } else { - gl_rend_state.active_bind_texture_2d(0, star_tex->glid); - shaders_ft.draw_arrays(GL_TRIANGLES, 0, star_count * 6); + rend_data_ctx.state.active_bind_texture_2d(0, star_tex->glid); + rend_data_ctx.state.draw_arrays(GL_TRIANGLES, 0, star_count * 6); } } - gl_rend_state.active_bind_texture_2d(0, 0); - gl_rend_state.bind_vertex_array(0); + rend_data_ctx.state.active_bind_texture_2d(0, 0); + rend_data_ctx.state.bind_vertex_array(0); } @@ -5224,13 +5231,13 @@ bool star_catalog::init() { star_count = (int32_t)vec.size(); - stars_ssbo.Create(sizeof(stars_buffer_data) * vec.size(), vec.data()); + stars_ssbo.Create(gl_state, sizeof(stars_buffer_data) * vec.size(), vec.data()); } milky_way.create_default_sphere(); - scene_ubo.Create(sizeof(star_catalog_scene_shader_data)); - batch_ubo.Create(sizeof(star_catalog_batch_shader_data)); + scene_ubo.Create(gl_state, sizeof(star_catalog_scene_shader_data)); + batch_ubo.Create(gl_state, sizeof(star_catalog_batch_shader_data)); return true; } @@ -5574,28 +5581,30 @@ bool EffectManager::unload() { return false; } -static void draw_fog_particle(EffectFogRing* data, mat4* mat) { +static void draw_fog_particle(render_data_context& rend_data_ctx, + EffectFogRing* data, const cam_data& cam, mat4* mat) { if (!data->num_vtx) return; - shaders_ft.set(SHADER_FT_FOGPTCL); - gl_rend_state.enable_blend(); + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_FOGPTCL); + rend_data_ctx.state.enable_blend(); texture* tex = texture_manager_get_texture(data->tex_id); if (tex) - gl_rend_state.active_bind_texture_2d(0, tex->glid); - gl_rend_state.bind_vertex_array(rctx_ptr->common_vao); - data->ssbo.Bind(0); - shaders_ft.draw_arrays(GL_TRIANGLES, 0, data->num_vtx); - gl_rend_state.bind_vertex_array(0); - gl_rend_state.disable_blend(); - shader::unbind(); + rend_data_ctx.state.active_bind_texture_2d(0, tex->glid); + rend_data_ctx.state.bind_vertex_array(rctx_ptr->common_vao); + rend_data_ctx.state.bind_shader_storage_buffer_base(0, data->ssbo); + rend_data_ctx.state.draw_arrays(GL_TRIANGLES, 0, data->num_vtx); + rend_data_ctx.state.bind_vertex_array(0); + rend_data_ctx.state.disable_blend(); + shader::unbind(rend_data_ctx.state); } -static void draw_ripple_particles(ripple_struct* data, mat4* mat) { +static void draw_ripple_particles(render_data_context& rend_data_ctx, + ripple_struct* data, const cam_data& cam, mat4* mat) { if (data->count > 5000) return; - vec3* vtx_data = (vec3*)ripple_emit_ssbo.MapMemory(); + vec3* vtx_data = (vec3*)ripple_emit_ssbo.MapMemory(rend_data_ctx.state); if (!vtx_data) return; @@ -5605,7 +5614,7 @@ static void draw_ripple_particles(ripple_struct* data, mat4* mat) { for (size_t i = data->count; i; i--, vtx_data++, position++, color++) *vtx_data = { position->x, -position->z, (float_t)color->a * (float_t)(1.0 / 255.0) }; - ripple_emit_ssbo.UnmapMemory(); + ripple_emit_ssbo.UnmapMemory(rend_data_ctx.state); int32_t size = (int32_t)(data->size + 0.5f); @@ -5628,29 +5637,30 @@ static void draw_ripple_particles(ripple_struct* data, mat4* mat) { 1.0f / (float_t)width, 1.0f / (float_t)height, 0.0f, 0.0f }; - ripple_emit_scene_ubo.WriteMemory(shader_data); + ripple_emit_scene_ubo.WriteMemory(rend_data_ctx.state, shader_data); - uniform_value[U_RIPPLE] = data->ripple_uniform; - uniform_value[U_RIPPLE_EMIT] = data->ripple_emit_uniform; + rend_data_ctx.shader_flags.arr[U_RIPPLE] = data->ripple_uniform; + rend_data_ctx.shader_flags.arr[U_RIPPLE_EMIT] = data->ripple_emit_uniform; - gl_rend_state.begin_event("EffectRipple::Impl::draw_ripple_particles"); - gl_rend_state.set_color_mask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE); - gl_rend_state.bind_vertex_array(rctx_ptr->common_vao); + rend_data_ctx.state.begin_event("EffectRipple::Impl::draw_ripple_particles"); + rend_data_ctx.state.set_color_mask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE); + rend_data_ctx.state.bind_vertex_array(rctx_ptr->common_vao); - shaders_ft.set(SHADER_FT_RIPEMIT); - ripple_emit_scene_ubo.Bind(0); - ripple_emit_ssbo.Bind(0); - shaders_ft.draw_arrays(GL_TRIANGLES, 0, data->count * 6); + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_RIPEMIT); + rend_data_ctx.state.bind_uniform_buffer_base(0, ripple_emit_scene_ubo); + rend_data_ctx.state.bind_shader_storage_buffer_base(0, ripple_emit_ssbo); + rend_data_ctx.state.draw_arrays(GL_TRIANGLES, 0, data->count * 6); - shader::unbind(); + shader::unbind(rend_data_ctx.state); - gl_rend_state.bind_vertex_array(0); - gl_rend_state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - gl_rend_state.end_event(); + rend_data_ctx.state.bind_vertex_array(0); + rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + rend_data_ctx.state.end_event(); } -static void draw_water_particle(water_particle* data, mat4* mat) { - data->draw(mat); +static void draw_water_particle(render_data_context& rend_data_ctx, + water_particle* data, const cam_data& cam, mat4* mat) { + data->draw(rend_data_ctx, cam, mat); } static void leaf_particle_init(bool change_stage) { @@ -5691,10 +5701,10 @@ static void leaf_particle_init(bool change_stage) { if (!leaf_ptcl_vao) glGenVertexArrays(1, &leaf_ptcl_vao); - leaf_ptcl_vbo.Create(buffer_size * leaf_ptcl_vtx_count); - glBindBuffer(GL_ARRAY_BUFFER, leaf_ptcl_vbo); + leaf_ptcl_vbo.Create(gl_state, buffer_size * leaf_ptcl_vtx_count); + gl_state.bind_array_buffer(leaf_ptcl_vbo); - glBindVertexArray(leaf_ptcl_vao); + gl_state.bind_vertex_array(leaf_ptcl_vao); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, buffer_size, (void*)offsetof(leaf_particle_vertex_data, position)); @@ -5705,15 +5715,15 @@ static void leaf_particle_init(bool change_stage) { glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, buffer_size, (void*)offsetof(leaf_particle_vertex_data, normal)); - leaf_ptcl_ebo.Create(sizeof(uint32_t) * ebo_count, ebo_data); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, leaf_ptcl_ebo); + leaf_ptcl_ebo.Create(gl_state, sizeof(uint32_t) * ebo_count, ebo_data); + gl_state.bind_element_array_buffer(leaf_ptcl_ebo); - glBindVertexArray(0); - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + gl_state.bind_vertex_array(0); + gl_state.bind_array_buffer(0); + gl_state.bind_element_array_buffer(0); free_def(ebo_data); - leaf_particle_scene_ubo.Create(sizeof(leaf_particle_scene_shader_data)); + leaf_particle_scene_ubo.Create(gl_state, sizeof(leaf_particle_scene_shader_data)); } static float_t sub_14034C960(vec3 x) { @@ -5787,7 +5797,7 @@ static std::pair sub_1406427A0(vec3 x, vec3 y) { return { t3 * x, t3 * t1 }; } -static int32_t leaf_particle_disp() { +static int32_t leaf_particle_disp(render_data_context& rend_data_ctx) { float_t size = leaf_ptcl_data[0].size; vec3 position[4]; @@ -5801,7 +5811,7 @@ static int32_t leaf_particle_disp() { normal[2] = sub_1406427A0(vec3(-0.2f, -0.2f, 1.0f), vec3(0.0f, 1.0f, 0.0f)).first; normal[3] = sub_1406427A0(vec3( 0.4f, -0.4f, 1.0f), vec3(0.0f, 1.0f, 0.0f)).first; - leaf_particle_vertex_data* vtx_data = (leaf_particle_vertex_data*)leaf_ptcl_vbo.MapMemory(); + leaf_particle_vertex_data* vtx_data = (leaf_particle_vertex_data*)leaf_ptcl_vbo.MapMemory(rend_data_ctx.state); if (!vtx_data) return 0; @@ -5879,7 +5889,7 @@ static int32_t leaf_particle_disp() { } } - leaf_ptcl_vbo.UnmapMemory(); + leaf_ptcl_vbo.UnmapMemory(rend_data_ctx.state); return vtx_count; } @@ -5924,10 +5934,10 @@ static void particle_init(vec3* offset) { if (!ptcl_vao) glGenVertexArrays(1, &ptcl_vao); - ptcl_vbo.Create(buffer_size * ptcl_vtx_count); - glBindBuffer(GL_ARRAY_BUFFER, ptcl_vbo); + ptcl_vbo.Create(gl_state, buffer_size * ptcl_vtx_count); + gl_state.bind_array_buffer(ptcl_vbo); - glBindVertexArray(ptcl_vao); + gl_state.bind_vertex_array(ptcl_vao); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, buffer_size, (void*)offsetof(particle_vertex_data, position)); @@ -5941,10 +5951,10 @@ static void particle_init(vec3* offset) { glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, buffer_size, (void*)offsetof(particle_vertex_data, normal)); - glBindVertexArray(0); - glBindBuffer(GL_ARRAY_BUFFER, 0); + gl_state.bind_vertex_array(0); + gl_state.bind_array_buffer(0); - particle_scene_ubo.Create(sizeof(particle_scene_shader_data)); + particle_scene_ubo.Create(gl_state, sizeof(particle_scene_shader_data)); } static void particle_ctrl() { @@ -6180,12 +6190,12 @@ static void rain_particle_init(bool change_stage) { vtx_data -= rain_ptcl_count; - rain_ssbo.Create(sizeof(vec3) * rain_ptcl_count, vtx_data); + rain_ssbo.Create(gl_state, sizeof(vec3) * rain_ptcl_count, vtx_data); free_def(vtx_data); - rain_particle_scene_ubo.Create(sizeof(rain_particle_scene_shader_data)); - rain_particle_batch_ubo.Create(sizeof(rain_particle_batch_shader_data)); + rain_particle_scene_ubo.Create(gl_state, sizeof(rain_particle_scene_shader_data)); + rain_particle_batch_ubo.Create(gl_state, sizeof(rain_particle_batch_shader_data)); } static void rain_particle_ctrl() { @@ -6218,12 +6228,12 @@ static void rain_particle_free() { } static void ripple_emit_init() { - ripple_batch_ubo.Create(sizeof(ripple_batch_shader_data)); - ripple_scene_ubo.Create(sizeof(ripple_scene_shader_data)); + ripple_batch_ubo.Create(gl_state, sizeof(ripple_batch_shader_data)); + ripple_scene_ubo.Create(gl_state, sizeof(ripple_scene_shader_data)); - ripple_emit_ssbo.Create(sizeof(vec3) * ripple_emit_count); + ripple_emit_ssbo.Create(gl_state, sizeof(vec3) * ripple_emit_count); - ripple_emit_scene_ubo.Create(sizeof(ripple_emit_scene_shader_data)); + ripple_emit_scene_ubo.Create(gl_state, sizeof(ripple_emit_scene_shader_data)); } static void ripple_emit_free() { @@ -6312,13 +6322,13 @@ static void snow_particle_init(bool change_stage) { if (change_stage) { snow_ssbo.Destroy(); - snow_ssbo.Create(sizeof(snow_particle_vertex_data) * snow->num_snow); + snow_ssbo.Create(gl_state, sizeof(snow_particle_vertex_data) * snow->num_snow); return; } snow_particle_free(); - snow_ssbo.Create(sizeof(snow_particle_vertex_data) * snow->num_snow); + snow_ssbo.Create(gl_state, sizeof(snow_particle_vertex_data) * snow->num_snow); snow_particle_gpu_vertex_data* vtx_data = force_malloc(snow_ptcl_count); @@ -6331,14 +6341,14 @@ static void snow_particle_init(bool change_stage) { vtx_data -= snow_ptcl_count; - snow_gpu_ssbo.Create(sizeof(snow_particle_gpu_vertex_data) * snow_ptcl_count, vtx_data); + snow_gpu_ssbo.Create(gl_state, sizeof(snow_particle_gpu_vertex_data) * snow_ptcl_count, vtx_data); free_def(vtx_data); - snow_fallen_ssbo.Create(sizeof(snow_particle_vertex_data) * snow_ptcl_fallen_count); + snow_fallen_ssbo.Create(gl_state, sizeof(snow_particle_vertex_data) * snow_ptcl_fallen_count); - snow_particle_scene_ubo.Create(sizeof(snow_particle_scene_shader_data)); - snow_particle_batch_ubo.Create(sizeof(snow_particle_batch_shader_data)); + snow_particle_scene_ubo.Create(gl_state, sizeof(snow_particle_scene_shader_data)); + snow_particle_batch_ubo.Create(gl_state, sizeof(snow_particle_batch_shader_data)); } static void snow_particle_ctrl() { @@ -6425,7 +6435,7 @@ static void snow_particle_ctrl() { snow_particle_data_kill_fallen(snow_ptcl_fallen, true); } - snow_particle_vertex_data* vtx_data = (snow_particle_vertex_data*)snow_ssbo.MapMemory(); + snow_particle_vertex_data* vtx_data = (snow_particle_vertex_data*)snow_ssbo.MapMemory(gl_state); if (vtx_data) { particle_data* snow_ptcl = snow_ptcl_data; for (int32_t i = snow->num_snow; i; i--, snow_ptcl++, vtx_data++) { @@ -6434,9 +6444,9 @@ static void snow_particle_ctrl() { vtx_data->alpha = snow_ptcl->alpha; } } - snow_ssbo.UnmapMemory(); + snow_ssbo.UnmapMemory(gl_state); - snow_particle_vertex_data* fallen_vtx_data = (snow_particle_vertex_data*)snow_fallen_ssbo.MapMemory(); + snow_particle_vertex_data* fallen_vtx_data = (snow_particle_vertex_data*)snow_fallen_ssbo.MapMemory(gl_state); if (fallen_vtx_data) { particle_data* snow_ptcl_fallen = snow_ptcl_fallen_data; for (size_t i = snow_ptcl_fallen_count; i; i--, snow_ptcl_fallen++, fallen_vtx_data++) { @@ -6445,7 +6455,7 @@ static void snow_particle_ctrl() { fallen_vtx_data->alpha = snow_ptcl_fallen->alpha; } } - snow_fallen_ssbo.UnmapMemory(); + snow_fallen_ssbo.UnmapMemory(gl_state); } static void snow_particle_data_init() { @@ -6546,33 +6556,35 @@ static void snow_particle_free() { } static void water_particle_init() { - water_particle_scene_ubo.Create(sizeof(water_particle_scene_shader_data)); + water_particle_scene_ubo.Create(gl_state, sizeof(water_particle_scene_shader_data)); } static void water_particle_free() { water_particle_scene_ubo.Destroy(); } -static void sub_1403B6ED0(RenderTexture* a1, RenderTexture* a2, RenderTexture* a3, ripple_emit_params& params) { - a1->Bind(); +static void sub_1403B6ED0(render_data_context& rend_data_ctx, RenderTexture* a1, + RenderTexture* a2, RenderTexture* a3, ripple_emit_params& params) { + a1->Bind(rend_data_ctx.state); if (a1->color_texture->internal_format == GL_RGBA32F || a1->color_texture->internal_format == GL_RGBA16F) - uniform_value[U_RIPPLE] = 1; + rend_data_ctx.shader_flags.arr[U_RIPPLE] = 1; else - uniform_value[U_RIPPLE] = 0; - sub_1403B6F60(a1->color_texture, a2->color_texture, a3->color_texture, params); - gl_rend_state.bind_framebuffer(0); + rend_data_ctx.shader_flags.arr[U_RIPPLE] = 0; + sub_1403B6F60(rend_data_ctx, a1->color_texture, a2->color_texture, a3->color_texture, params); + rend_data_ctx.state.bind_framebuffer(0); } -static void sub_1403B6F60(texture* a1, texture* a2, texture* a3, ripple_emit_params& params) { +static void sub_1403B6F60(render_data_context& rend_data_ctx, + texture* a1, texture* a2, texture* a3, ripple_emit_params& params) { if (!a1 || !a1->glid || !a2 || !a2->glid || !a3 || !a3->glid) return; int32_t width = a2->width; int32_t height = a2->height; - gl_rend_state_rect viewport_rect = gl_rend_state.get_viewport(); - gl_rend_state.set_viewport(1, 1, width - 2, height - 2); + gl_rend_state_rect viewport_rect = rend_data_ctx.state.get_viewport(); + rend_data_ctx.state.set_viewport(1, 1, width - 2, height - 2); ripple_scene_shader_data ripple_scene = {}; ripple_scene.g_transform = { @@ -6580,22 +6592,22 @@ static void sub_1403B6F60(texture* a1, texture* a2, texture* a3, ripple_emit_par (float_t)width / (float_t)(width - 2), (float_t)height / (float_t)(height - 2) }; ripple_scene.g_texcoord = { 1.0f, 0.0f, 0.0f, 0.0f }; - ripple_scene_ubo.WriteMemory(ripple_scene); + ripple_scene_ubo.WriteMemory(rend_data_ctx.state, ripple_scene); ripple_batch_shader_data ripple_batch = {}; ripple_batch.g_params = { params.wake_attn, 0.0f, 0.0f, 0.0f }; - ripple_batch_ubo.WriteMemory(ripple_batch); + ripple_batch_ubo.WriteMemory(rend_data_ctx.state, ripple_batch); - gl_rend_state.bind_vertex_array(rctx_ptr->common_vao); - shaders_ft.set(SHADER_FT_RIPPLE); - ripple_scene_ubo.Bind(0); - ripple_batch_ubo.Bind(1); - gl_rend_state.active_bind_texture_2d(0, a2->glid); - gl_rend_state.active_bind_texture_2d(1, a3->glid); - shaders_ft.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); - gl_rend_state.active_bind_texture_2d(1, 0); - gl_rend_state.active_bind_texture_2d(0, 0); - gl_rend_state.bind_vertex_array(0); + rend_data_ctx.state.bind_vertex_array(rctx_ptr->common_vao); + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_RIPPLE); + rend_data_ctx.state.bind_uniform_buffer_base(0, ripple_scene_ubo); + rend_data_ctx.state.bind_uniform_buffer_base(1, ripple_batch_ubo); + rend_data_ctx.state.active_bind_texture_2d(0, a2->glid); + rend_data_ctx.state.active_bind_texture_2d(1, a3->glid); + rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); + rend_data_ctx.state.active_bind_texture_2d(1, 0); + rend_data_ctx.state.active_bind_texture_2d(0, 0); + rend_data_ctx.state.bind_vertex_array(0); - gl_rend_state.set_viewport(viewport_rect); + rend_data_ctx.state.set_viewport(viewport_rect); } diff --git a/src/CRE/effect.hpp b/src/CRE/effect.hpp index 58377fdb..e447800b 100644 --- a/src/CRE/effect.hpp +++ b/src/CRE/effect.hpp @@ -49,11 +49,11 @@ struct particle_event_data { particle_event_data(); }; -extern void leaf_particle_draw(); -extern void rain_particle_draw(); -extern void particle_draw(); -extern void snow_particle_draw(); -extern void star_catalog_draw(); +extern void leaf_particle_draw(struct render_data_context& rend_data_ctx, const struct cam_data& cam); +extern void rain_particle_draw(struct render_data_context& rend_data_ctx, const struct cam_data& cam); +extern void particle_draw(struct render_data_context& rend_data_ctx, const struct cam_data& cam); +extern void snow_particle_draw(struct render_data_context& rend_data_ctx, const struct cam_data& cam); +extern void star_catalog_draw(struct render_data_context& rend_data_ctx, const struct cam_data& cam); extern void effect_init(); extern void effect_free(); diff --git a/src/CRE/gl_rend_state.cpp b/src/CRE/gl_rend_state.cpp index e3621f08..3836f305 100644 --- a/src/CRE/gl_rend_state.cpp +++ b/src/CRE/gl_rend_state.cpp @@ -5,9 +5,472 @@ #include "gl_rend_state.hpp" -gl_rend_state_struct gl_rend_state; +struct gl_rend_state { + GLuint program; + GLuint active_texture_index; + GLuint texture_binding_2d[32]; + GLuint texture_binding_cube_map[32]; + GLuint sampler_binding[32]; + GLboolean blend; + GLenum blend_src_rgb; + GLenum blend_src_alpha; + GLenum blend_dst_rgb; + GLenum blend_dst_alpha; + GLenum blend_mode_rgb; + GLenum blend_mode_alpha; + GLuint read_framebuffer_binding; + GLuint draw_framebuffer_binding; + GLuint vertex_array_binding; + GLuint array_buffer_binding; + GLuint element_array_buffer_binding; + GLuint uniform_buffer_binding; + GLuint uniform_buffer_bindings[14]; + GLintptr uniform_buffer_offsets[14]; + GLsizeiptr uniform_buffer_sizes[14]; + GLuint shader_storage_buffer_binding; + GLuint shader_storage_buffer_bindings[14]; + GLintptr shader_storage_buffer_offsets[14]; + GLsizeiptr shader_storage_buffer_sizes[14]; + GLboolean color_mask[4]; + GLboolean cull_face; + GLenum cull_face_mode; + GLboolean depth_test; + GLenum depth_func; + GLboolean depth_mask; + GLfloat line_width; + GLenum polygon_mode; + GLboolean multisample; + GLboolean primitive_restart; + GLuint primitive_restart_index; + gl_rend_state_rect scissor_box; + GLboolean scissor_test; + GLboolean stencil_test; + GLenum stencil_func; + GLenum stencil_fail; + GLenum stencil_dpfail; + GLenum stencil_dppass; + GLuint stencil_mask; + GLint stencil_ref; + GLuint stencil_value_mask; + gl_rend_state_rect viewport; -void gl_rend_state_struct::active_bind_texture_2d(int32_t index, GLuint texture, bool force) { + void active_bind_texture_2d(int32_t index, GLuint texture, bool force = false); + void active_bind_texture_cube_map(int32_t index, GLuint texture, bool force = false); + void active_texture(size_t index, bool force = false); + void begin_event(const char* message, int32_t length); + void bind_framebuffer(GLuint framebuffer, bool force = false); + void bind_read_framebuffer(GLuint framebuffer, bool force = false); + void bind_draw_framebuffer(GLuint framebuffer, bool force = false); + void bind_vertex_array(GLuint array, bool force = false); + void bind_array_buffer(GLuint buffer, bool force = false); + void bind_element_array_buffer(GLuint buffer, bool force = false); + void bind_uniform_buffer(GLuint buffer, bool force = false); + void bind_uniform_buffer_base(GLuint index, GLuint buffer, bool force = false); + void bind_uniform_buffer_range(GLuint index, + GLuint buffer, GLintptr offset, GLsizeiptr size, bool force = false); + void bind_shader_storage_buffer(GLuint buffer, bool force = false); + void bind_shader_storage_buffer_base(GLuint index, GLuint buffer, bool force = false); + void bind_shader_storage_buffer_range(GLuint index, + GLuint buffer, GLintptr offset, GLsizeiptr size, bool force = false); + void bind_texture_2d(GLuint texture, bool force = false); + void bind_texture_cube_map(GLuint texture, bool force = false); + void bind_sampler(int32_t index, GLuint sampler, bool force = false); + bool check_uniform_buffer_binding(); + bool check_uniform_buffer_binding_base(size_t index); + bool check_shader_storage_buffer_binding(); + bool check_shader_storage_buffer_binding_base(size_t index); + bool check_texture_binding_2d(size_t index); + bool check_texture_binding_cube_map(size_t index); + bool check_sampler_binding(int32_t index, GLuint sampler); + void disable_blend(bool force = false); + void disable_cull_face(bool force = false); + void disable_depth_test(bool force = false); + void disable_multisample(bool force = false); + void disable_primitive_restart(bool force = false); + void disable_scissor_test(bool force = false); + void disable_stencil_test(bool force = false); + void enable_blend(bool force = false); + void enable_cull_face(bool force = false); + void enable_depth_test(bool force = false); + void enable_multisample(bool force = false); + void enable_primitive_restart(bool force = false); + void enable_scissor_test(bool force = false); + void enable_stencil_test(bool force = false); + void end_event(); + void get(); + GLuint get_program(); + gl_rend_state_rect get_scissor(); + void get_scissor(GLint& x, GLint& y, GLsizei& width, GLsizei& height); + gl_rend_state_rect get_viewport(); + void get_viewport(GLint& x, GLint& y, GLsizei& width, GLsizei& height); + void set_blend_func(GLenum src, GLenum dst, bool force = false); + void set_blend_func_separate(GLenum src_rgb, GLenum dst_rgb, + GLenum src_alpha, GLenum dst_alpha, bool force = false); + void set_blend_equation(GLenum mode, bool force = false); + void set_blend_equation_separate( + GLenum mode_rgb, GLenum mode_alpha, bool force = false); + void set_color_mask(GLboolean red, GLboolean green, + GLboolean blue, GLboolean alpha, bool force = false); + void set_cull_face_mode(GLenum mode, bool force = false); + void set_depth_func(GLenum func, bool force = false); + void set_depth_mask(GLboolean flag, bool force = false); + void set_line_width(GLfloat width, bool force = false); + void set_polygon_mode(GLenum face, GLenum mode, bool force = false); + void set_primitive_restart_index(GLuint index, bool force = false); + void set_scissor(const gl_rend_state_rect& rect, bool force = false); + void set_scissor(GLint x, GLint y, GLsizei width, GLsizei height, bool force = false); + void set_stencil_func(GLenum func, GLint ref, GLuint mask, bool force = false); + void set_stencil_mask(GLuint mask, bool force = false); + void set_stencil_op(GLenum sfail, GLenum dpfail, GLenum dppass, bool force = false); + void set_viewport(const gl_rend_state_rect& rect, bool force = false); + void set_viewport(GLint x, GLint y, GLsizei width, GLsizei height, bool force = false); + void use_program(GLuint program, bool force = false); +}; + +gl_rend_state gl_state_data[GL_REND_STATE_COUNT]; + +p_gl_rend_state::p_gl_rend_state(int32_t index) : ptr(gl_state_data[index]) { + +} + +void p_gl_rend_state::active_bind_texture_2d(int32_t index, GLuint texture, bool force) { + ptr.active_bind_texture_2d(index, texture, force); +} + +void p_gl_rend_state::active_bind_texture_cube_map(int32_t index, GLuint texture, bool force) { + ptr.active_bind_texture_cube_map(index, texture, force); +} + +void p_gl_rend_state::active_texture(size_t index, bool force) { + ptr.active_texture(index, force); +} + +void p_gl_rend_state::begin_event(const char* message, int32_t length) { + ptr.begin_event(message, length); +} + +void p_gl_rend_state::bind_framebuffer(GLuint framebuffer, bool force) { + ptr.bind_framebuffer(framebuffer, force); +} + +void p_gl_rend_state::bind_read_framebuffer(GLuint framebuffer, bool force) { + ptr.bind_read_framebuffer(framebuffer, force); +} + +void p_gl_rend_state::bind_draw_framebuffer(GLuint framebuffer, bool force) { + ptr.bind_draw_framebuffer(framebuffer, force); +} + +void p_gl_rend_state::bind_vertex_array(GLuint array, bool force) { + ptr.bind_vertex_array(array, force); +} + +void p_gl_rend_state::bind_array_buffer(GLuint buffer, bool force) { + ptr.bind_array_buffer(buffer, force); +} + +void p_gl_rend_state::bind_element_array_buffer(GLuint buffer, bool force) { + ptr.bind_element_array_buffer(buffer, force); +} + +void p_gl_rend_state::bind_uniform_buffer(GLuint buffer, bool force) { + ptr.bind_uniform_buffer(buffer, force); +} + +void p_gl_rend_state::bind_uniform_buffer_base(GLuint index, GLuint buffer, bool force) { + ptr.bind_uniform_buffer_base(index, buffer, force); +} + +void p_gl_rend_state::bind_uniform_buffer_range(GLuint index, + GLuint buffer, GLintptr offset, GLsizeiptr size, bool force) { + ptr.bind_uniform_buffer_range(index, buffer, offset, size, force); +} + +void p_gl_rend_state::bind_shader_storage_buffer(GLuint buffer, bool force) { + ptr.bind_shader_storage_buffer(buffer, force); +} + +void p_gl_rend_state::bind_shader_storage_buffer_base(GLuint index, GLuint buffer, bool force) { + ptr.bind_shader_storage_buffer_base(index, buffer, force); +} + +void p_gl_rend_state::bind_shader_storage_buffer_range(GLuint index, + GLuint buffer, GLintptr offset, GLsizeiptr size, bool force) { + ptr.bind_shader_storage_buffer_range(index, buffer, offset, size, force); +} + +void p_gl_rend_state::bind_texture_2d(GLuint texture, bool force) { + ptr.bind_texture_2d(texture, force); +} + +void p_gl_rend_state::bind_texture_cube_map(GLuint texture, bool force) { + ptr.bind_texture_cube_map(texture, force); +} + +void p_gl_rend_state::bind_sampler(int32_t index, GLuint sampler, bool force) { + ptr.bind_sampler(index, sampler, force); +} + +bool p_gl_rend_state::check_uniform_buffer_binding() { + return ptr.check_uniform_buffer_binding(); +} + +bool p_gl_rend_state::check_uniform_buffer_binding_base(size_t index) { + return ptr.check_uniform_buffer_binding_base(index); +} + +bool p_gl_rend_state::check_shader_storage_buffer_binding() { + return ptr.check_shader_storage_buffer_binding(); +} + +bool p_gl_rend_state::check_shader_storage_buffer_binding_base(size_t index) { + return ptr.check_shader_storage_buffer_binding_base(index); +} + +bool p_gl_rend_state::check_texture_binding_2d(size_t index) { + return ptr.check_texture_binding_2d(index); +} + +bool p_gl_rend_state::check_texture_binding_cube_map(size_t index) { + return ptr.check_texture_binding_cube_map(index); +} + +bool p_gl_rend_state::check_sampler_binding(int32_t index, GLuint sampler) { + return ptr.check_sampler_binding(index, sampler); +} + +void p_gl_rend_state::disable_blend(bool force) { + ptr.disable_blend(force); +} + +void p_gl_rend_state::disable_cull_face(bool force) { + ptr.disable_cull_face(force); +} + +void p_gl_rend_state::disable_depth_test(bool force) { + ptr.disable_depth_test(force); +} + +void p_gl_rend_state::disable_multisample(bool force) { + ptr.disable_multisample(force); +} + +void p_gl_rend_state::disable_primitive_restart(bool force) { + ptr.disable_primitive_restart(force); +} + +void p_gl_rend_state::disable_scissor_test(bool force) { + ptr.disable_scissor_test(force); +} + +void p_gl_rend_state::disable_stencil_test(bool force) { + ptr.disable_stencil_test(force); +} + +void p_gl_rend_state::draw_arrays(GLenum mode, GLint first, GLsizei count) { + glDrawArrays(mode, first, count); +} + +void p_gl_rend_state::draw_elements(GLenum mode, + GLsizei count, GLenum type, const void* indices) { + switch (mode) { + case GL_TRIANGLE_STRIP: + uint32_t index; + switch (type) { + case GL_UNSIGNED_BYTE: + index = 0xFF; + break; + case GL_UNSIGNED_SHORT: + index = 0xFFFF; + break; + case GL_UNSIGNED_INT: + default: + index = 0xFFFFFFFF; + break; + } + + enable_primitive_restart(); + set_primitive_restart_index(index); + break; + } + + glDrawElements(mode, count, type, indices); + + switch (mode) { + case GL_TRIANGLE_STRIP: + disable_primitive_restart(); + break; + } +} + +void p_gl_rend_state::draw_range_elements(GLenum mode, + GLuint start, GLuint end, GLsizei count, GLenum type, const void* indices) { + switch (mode) { + case GL_TRIANGLE_STRIP: + uint32_t index; + switch (type) { + case GL_UNSIGNED_BYTE: + index = 0xFF; + break; + case GL_UNSIGNED_SHORT: + index = 0xFFFF; + break; + case GL_UNSIGNED_INT: + default: + index = 0xFFFFFFFF; + break; + } + + enable_primitive_restart(); + set_primitive_restart_index(index); + break; + } + + glDrawRangeElements(mode, start, end, count, type, indices); + + switch (mode) { + case GL_TRIANGLE_STRIP: + disable_primitive_restart(); + break; + } +} + +void p_gl_rend_state::enable_blend(bool force) { + ptr.enable_blend(force); +} + +void p_gl_rend_state::enable_cull_face(bool force) { + ptr.enable_cull_face(force); +} + +void p_gl_rend_state::enable_depth_test(bool force) { + ptr.enable_depth_test(force); +} + +void p_gl_rend_state::enable_multisample(bool force) { + ptr.enable_multisample(force); +} + +void p_gl_rend_state::enable_primitive_restart(bool force) { + ptr.enable_primitive_restart(force); +} + +void p_gl_rend_state::enable_scissor_test(bool force) { + ptr.enable_scissor_test(force); +} + +void p_gl_rend_state::enable_stencil_test(bool force) { + ptr.enable_stencil_test(force); +} + +void p_gl_rend_state::end_event() { + ptr.end_event(); +} + +void p_gl_rend_state::get() { + ptr.get(); +} + +GLuint p_gl_rend_state::get_program() { + return ptr.get_program(); +} + +gl_rend_state_rect p_gl_rend_state::get_scissor() { + return ptr.get_scissor(); +} + +void p_gl_rend_state::get_scissor(GLint& x, GLint& y, GLsizei& width, GLsizei& height) { + ptr.get_scissor(x, y, width, height); +} + +gl_rend_state_rect p_gl_rend_state::get_viewport() { + return ptr.get_viewport(); +} + +void p_gl_rend_state::get_viewport(GLint& x, GLint& y, GLsizei& width, GLsizei& height) { + ptr.get_viewport(x, y, width, height); +} + +void p_gl_rend_state::set_blend_func(GLenum src, GLenum dst, bool force) { + ptr.set_blend_func(src, dst, force); +} + +void p_gl_rend_state::set_blend_func_separate(GLenum src_rgb, GLenum dst_rgb, + GLenum src_alpha, GLenum dst_alpha, bool force) { + ptr.set_blend_func_separate(src_rgb, dst_rgb, src_alpha, dst_alpha, force); +} + +void p_gl_rend_state::set_blend_equation(GLenum mode, bool force) { + ptr.set_blend_equation(mode, force); +} + +void p_gl_rend_state::set_blend_equation_separate( + GLenum mode_rgb, GLenum mode_alpha, bool force) { + ptr.set_blend_equation_separate(mode_rgb, mode_alpha, force); +} + +void p_gl_rend_state::set_color_mask(GLboolean red, GLboolean green, + GLboolean blue, GLboolean alpha, bool force) { + ptr.set_color_mask(red, green, blue, alpha, force); +} + +void p_gl_rend_state::set_cull_face_mode(GLenum mode, bool force) { + ptr.set_cull_face_mode(mode, force); +} + +void p_gl_rend_state::set_depth_func(GLenum func, bool force) { + ptr.set_depth_func(func, force); +} + +void p_gl_rend_state::set_depth_mask(GLboolean flag, bool force) { + ptr.set_depth_mask(flag, force); +} + +void p_gl_rend_state::set_line_width(GLfloat width, bool force) { + ptr.set_line_width(width, force); +} + +void p_gl_rend_state::set_polygon_mode(GLenum face, GLenum mode, bool force) { + ptr.set_polygon_mode(face, mode, force); +} + +void p_gl_rend_state::set_primitive_restart_index(GLuint index, bool force) { + ptr.set_primitive_restart_index(index, force); +} + +void p_gl_rend_state::set_scissor(const gl_rend_state_rect& rect, bool force) { + ptr.set_scissor(rect, force); +} + +void p_gl_rend_state::set_scissor(GLint x, GLint y, GLsizei width, GLsizei height, bool force) { + ptr.set_scissor(x, y, width, height, force); +} + +void p_gl_rend_state::set_stencil_func(GLenum func, GLint ref, GLuint mask, bool force) { + ptr.set_stencil_func(func, ref, mask, force); +} + +void p_gl_rend_state::set_stencil_mask(GLuint mask, bool force) { + ptr.set_stencil_mask(mask, force); +} + +void p_gl_rend_state::set_stencil_op(GLenum sfail, GLenum dpfail, GLenum dppass, bool force) { + ptr.set_stencil_op(sfail, dpfail, dppass, force); +} + +void p_gl_rend_state::set_viewport(const gl_rend_state_rect& rect, bool force) { + ptr.set_viewport(rect, force); +} + +void p_gl_rend_state::set_viewport(GLint x, GLint y, GLsizei width, GLsizei height, bool force) { + ptr.set_viewport(x, y, width, height, force); +} + +void p_gl_rend_state::use_program(GLuint program, bool force) { + ptr.use_program(program, force); +} + +void gl_rend_state::active_bind_texture_2d(int32_t index, GLuint texture, bool force) { if (force || texture_binding_2d[index] != texture) { if (force || active_texture_index != index) { glActiveTexture((GLenum)(GL_TEXTURE0 + index)); @@ -18,7 +481,7 @@ void gl_rend_state_struct::active_bind_texture_2d(int32_t index, GLuint texture, } } -void gl_rend_state_struct::active_bind_texture_cube_map(int32_t index, GLuint texture, bool force) { +void gl_rend_state::active_bind_texture_cube_map(int32_t index, GLuint texture, bool force) { if (force || texture_binding_cube_map[index] != texture) { if (force || active_texture_index != index) { glActiveTexture((GLenum)(GL_TEXTURE0 + index)); @@ -29,14 +492,18 @@ void gl_rend_state_struct::active_bind_texture_cube_map(int32_t index, GLuint te } } -void gl_rend_state_struct::active_texture(size_t index, bool force) { +void gl_rend_state::active_texture(size_t index, bool force) { if (force || active_texture_index != index) { glActiveTexture((GLenum)(GL_TEXTURE0 + index)); active_texture_index = (GLuint)index; } } -void gl_rend_state_struct::bind_framebuffer(GLuint framebuffer, bool force) { +void gl_rend_state::begin_event(const char* message, int32_t length) { + glPushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 0, (GLsizei)length, message); +} + +void gl_rend_state::bind_framebuffer(GLuint framebuffer, bool force) { if (force || read_framebuffer_binding != framebuffer || draw_framebuffer_binding != framebuffer) { glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); @@ -45,49 +512,49 @@ void gl_rend_state_struct::bind_framebuffer(GLuint framebuffer, bool force) { } } -void gl_rend_state_struct::bind_read_framebuffer(GLuint framebuffer, bool force) { +void gl_rend_state::bind_read_framebuffer(GLuint framebuffer, bool force) { if (force || read_framebuffer_binding != framebuffer) { glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer); read_framebuffer_binding = framebuffer; } } -void gl_rend_state_struct::bind_draw_framebuffer(GLuint framebuffer, bool force) { +void gl_rend_state::bind_draw_framebuffer(GLuint framebuffer, bool force) { if (force || draw_framebuffer_binding != framebuffer) { glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer); draw_framebuffer_binding = framebuffer; } } -void gl_rend_state_struct::bind_vertex_array(GLuint array, bool force) { +void gl_rend_state::bind_vertex_array(GLuint array, bool force) { if (force || vertex_array_binding != array) { glBindVertexArray(array); vertex_array_binding = array; } } -void gl_rend_state_struct::bind_array_buffer(GLuint buffer, bool force) { +void gl_rend_state::bind_array_buffer(GLuint buffer, bool force) { if (force || array_buffer_binding != buffer) { glBindBuffer(GL_ARRAY_BUFFER, buffer); array_buffer_binding = buffer; } } -void gl_rend_state_struct::bind_element_array_buffer(GLuint buffer, bool force) { +void gl_rend_state::bind_element_array_buffer(GLuint buffer, bool force) { if (force || element_array_buffer_binding != buffer) { glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer); element_array_buffer_binding = buffer; } } -void gl_rend_state_struct::bind_uniform_buffer(GLuint buffer, bool force) { +void gl_rend_state::bind_uniform_buffer(GLuint buffer, bool force) { if (force || uniform_buffer_binding != buffer) { glBindBuffer(GL_UNIFORM_BUFFER, buffer); uniform_buffer_binding = buffer; } } -void gl_rend_state_struct::bind_uniform_buffer_base(GLuint index, GLuint buffer, bool force) { +void gl_rend_state::bind_uniform_buffer_base(GLuint index, GLuint buffer, bool force) { if (force || uniform_buffer_bindings[index] != buffer) { glBindBufferBase(GL_UNIFORM_BUFFER, index, buffer); uniform_buffer_binding = buffer; @@ -97,7 +564,7 @@ void gl_rend_state_struct::bind_uniform_buffer_base(GLuint index, GLuint buffer, } } -void gl_rend_state_struct::bind_uniform_buffer_range(GLuint index, +void gl_rend_state::bind_uniform_buffer_range(GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size, bool force) { if (force || uniform_buffer_bindings[index] != buffer || uniform_buffer_offsets[index] != offset @@ -110,14 +577,14 @@ void gl_rend_state_struct::bind_uniform_buffer_range(GLuint index, } } -void gl_rend_state_struct::bind_shader_storage_buffer(GLuint buffer, bool force) { +void gl_rend_state::bind_shader_storage_buffer(GLuint buffer, bool force) { if (force || shader_storage_buffer_binding != buffer) { glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer); shader_storage_buffer_binding = buffer; } } -void gl_rend_state_struct::bind_shader_storage_buffer_base(GLuint index, GLuint buffer, bool force) { +void gl_rend_state::bind_shader_storage_buffer_base(GLuint index, GLuint buffer, bool force) { if (force || shader_storage_buffer_bindings[index] != buffer) { glBindBufferBase(GL_SHADER_STORAGE_BUFFER, index, buffer); shader_storage_buffer_binding = buffer; @@ -127,7 +594,7 @@ void gl_rend_state_struct::bind_shader_storage_buffer_base(GLuint index, GLuint } } -void gl_rend_state_struct::bind_shader_storage_buffer_range(GLuint index, +void gl_rend_state::bind_shader_storage_buffer_range(GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size, bool force) { if (force || shader_storage_buffer_bindings[index] != buffer || shader_storage_buffer_offsets[index] != offset @@ -140,154 +607,154 @@ void gl_rend_state_struct::bind_shader_storage_buffer_range(GLuint index, } } -void gl_rend_state_struct::bind_texture_2d(GLuint texture, bool force) { +void gl_rend_state::bind_texture_2d(GLuint texture, bool force) { if (texture_binding_2d[active_texture_index] != texture) { glBindTexture(GL_TEXTURE_2D, texture); texture_binding_2d[active_texture_index] = texture; } } -void gl_rend_state_struct::bind_texture_cube_map(GLuint texture, bool force) { +void gl_rend_state::bind_texture_cube_map(GLuint texture, bool force) { if (force || texture_binding_cube_map[active_texture_index] != texture) { glBindTexture(GL_TEXTURE_CUBE_MAP, texture); texture_binding_cube_map[active_texture_index] = texture; } } -void gl_rend_state_struct::bind_sampler(int32_t index, GLuint sampler, bool force) { +void gl_rend_state::bind_sampler(int32_t index, GLuint sampler, bool force) { if (force || sampler_binding[index] != sampler) { glBindSampler(index, sampler); sampler_binding[index] = sampler; } } -bool gl_rend_state_struct::check_uniform_buffer_binding() { +bool gl_rend_state::check_uniform_buffer_binding() { return uniform_buffer_binding != 0; } -bool gl_rend_state_struct::check_uniform_buffer_binding_base(size_t index) { +bool gl_rend_state::check_uniform_buffer_binding_base(size_t index) { return uniform_buffer_bindings[index] != 0; } -bool gl_rend_state_struct::check_shader_storage_buffer_binding() { +bool gl_rend_state::check_shader_storage_buffer_binding() { return shader_storage_buffer_binding != 0; } -bool gl_rend_state_struct::check_shader_storage_buffer_binding_base(size_t index) { +bool gl_rend_state::check_shader_storage_buffer_binding_base(size_t index) { return shader_storage_buffer_bindings[index] != 0; } -bool gl_rend_state_struct::check_texture_binding_2d(size_t index) { +bool gl_rend_state::check_texture_binding_2d(size_t index) { return texture_binding_2d[index] != 0; } -bool gl_rend_state_struct::check_texture_binding_cube_map(size_t index) { +bool gl_rend_state::check_texture_binding_cube_map(size_t index) { return texture_binding_cube_map[index] != 0; } -bool gl_rend_state_struct::check_sampler_binding(int32_t index, GLuint sampler) { +bool gl_rend_state::check_sampler_binding(int32_t index, GLuint sampler) { return sampler_binding[index] != 0; } -void gl_rend_state_struct::disable_blend(bool force) { +void gl_rend_state::disable_blend(bool force) { if (force || blend) { glDisable(GL_BLEND); blend = GL_FALSE; } } -void gl_rend_state_struct::disable_cull_face(bool force) { +void gl_rend_state::disable_cull_face(bool force) { if (force || cull_face) { glDisable(GL_CULL_FACE); cull_face = GL_FALSE; } } -void gl_rend_state_struct::disable_depth_test(bool force) { +void gl_rend_state::disable_depth_test(bool force) { if (force || depth_test) { glDisable(GL_DEPTH_TEST); depth_test = GL_FALSE; } } -void gl_rend_state_struct::disable_multisample(bool force) { +void gl_rend_state::disable_multisample(bool force) { if (force || multisample) { glDisable(GL_MULTISAMPLE); multisample = GL_FALSE; } } -void gl_rend_state_struct::disable_primitive_restart(bool force) { +void gl_rend_state::disable_primitive_restart(bool force) { if (force || primitive_restart) { glDisable(GL_PRIMITIVE_RESTART); primitive_restart = GL_FALSE; } } -void gl_rend_state_struct::disable_scissor_test(bool force) { +void gl_rend_state::disable_scissor_test(bool force) { if (force || scissor_test) { glDisable(GL_SCISSOR_TEST); scissor_test = GL_FALSE; } } -void gl_rend_state_struct::disable_stencil_test(bool force) { +void gl_rend_state::disable_stencil_test(bool force) { if (force || stencil_test) { glDisable(GL_STENCIL_TEST); stencil_test = GL_FALSE; } } -void gl_rend_state_struct::enable_blend(bool force) { +void gl_rend_state::enable_blend(bool force) { if (force || !blend) { glEnable(GL_BLEND); blend = GL_TRUE; } } -void gl_rend_state_struct::enable_cull_face(bool force) { +void gl_rend_state::enable_cull_face(bool force) { if (force || !cull_face) { glEnable(GL_CULL_FACE); cull_face = GL_TRUE; } } -void gl_rend_state_struct::enable_depth_test(bool force) { +void gl_rend_state::enable_depth_test(bool force) { if (force || !depth_test) { glEnable(GL_DEPTH_TEST); depth_test = GL_TRUE; } } -void gl_rend_state_struct::enable_multisample(bool force) { +void gl_rend_state::enable_multisample(bool force) { if (force || !multisample) { glEnable(GL_MULTISAMPLE); multisample = GL_TRUE; } } -void gl_rend_state_struct::enable_primitive_restart(bool force) { +void gl_rend_state::enable_primitive_restart(bool force) { if (force || !primitive_restart) { glEnable(GL_PRIMITIVE_RESTART); primitive_restart = GL_TRUE; } } -void gl_rend_state_struct::enable_scissor_test(bool force) { +void gl_rend_state::enable_scissor_test(bool force) { if (force || !scissor_test) { glEnable(GL_SCISSOR_TEST); scissor_test = GL_TRUE; } } -void gl_rend_state_struct::enable_stencil_test(bool force) { +void gl_rend_state::enable_stencil_test(bool force) { if (force || !stencil_test) { glEnable(GL_STENCIL_TEST); stencil_test = GL_TRUE; } } -void gl_rend_state_struct::get() { +void gl_rend_state::get() { glGetIntegerv(GL_CURRENT_PROGRAM, (GLint*)&program); GLenum active_texture = GL_TEXTURE0; glGetIntegerv(GL_ACTIVE_TEXTURE, (GLint*)&active_texture); @@ -364,33 +831,37 @@ void gl_rend_state_struct::get() { polygon_mode = GL_FILL; } -GLuint gl_rend_state_struct::get_program() { +void gl_rend_state::end_event() { + glPopDebugGroup(); +} + +GLuint gl_rend_state::get_program() { return program; } -gl_rend_state_rect gl_rend_state_struct::get_scissor() { +gl_rend_state_rect gl_rend_state::get_scissor() { return scissor_box; } -void gl_rend_state_struct::get_scissor(GLint& x, GLint& y, GLsizei& width, GLsizei& height) { +void gl_rend_state::get_scissor(GLint& x, GLint& y, GLsizei& width, GLsizei& height) { x = scissor_box.x; y = scissor_box.y; width = scissor_box.width; height = scissor_box.height; } -gl_rend_state_rect gl_rend_state_struct::get_viewport() { +gl_rend_state_rect gl_rend_state::get_viewport() { return viewport; } -void gl_rend_state_struct::get_viewport(GLint& x, GLint& y, GLsizei& width, GLsizei& height) { +void gl_rend_state::get_viewport(GLint& x, GLint& y, GLsizei& width, GLsizei& height) { x = viewport.x; y = viewport.y; width = viewport.width; height = viewport.height; } -void gl_rend_state_struct::set_blend_func(GLenum src, GLenum dst, bool force) { +void gl_rend_state::set_blend_func(GLenum src, GLenum dst, bool force) { if (force || blend_src_rgb != src || blend_dst_rgb != dst || blend_src_alpha != GL_ONE || blend_dst_alpha != GL_ONE_MINUS_SRC_ALPHA) { glBlendFuncSeparate(src, dst, GL_ONE, GL_ONE_MINUS_SRC_ALPHA); @@ -401,7 +872,7 @@ void gl_rend_state_struct::set_blend_func(GLenum src, GLenum dst, bool force) { } } -void gl_rend_state_struct::set_blend_func_separate(GLenum src_rgb, GLenum dst_rgb, +void gl_rend_state::set_blend_func_separate(GLenum src_rgb, GLenum dst_rgb, GLenum src_alpha, GLenum dst_alpha, bool force) { if (force || blend_src_rgb != src_rgb || blend_dst_rgb != dst_rgb || blend_src_alpha != src_alpha || blend_dst_alpha != dst_alpha) { @@ -413,7 +884,7 @@ void gl_rend_state_struct::set_blend_func_separate(GLenum src_rgb, GLenum dst_rg } } -void gl_rend_state_struct::set_blend_equation(GLenum mode, bool force) { +void gl_rend_state::set_blend_equation(GLenum mode, bool force) { if (force || blend_mode_rgb != mode || blend_mode_alpha != mode) { glBlendEquationSeparate(mode, mode); blend_mode_rgb = mode; @@ -421,7 +892,7 @@ void gl_rend_state_struct::set_blend_equation(GLenum mode, bool force) { } } -void gl_rend_state_struct::set_blend_equation_separate(GLenum mode_rgb, GLenum mode_alpha, bool force) { +void gl_rend_state::set_blend_equation_separate(GLenum mode_rgb, GLenum mode_alpha, bool force) { if (force || blend_mode_rgb != mode_rgb || blend_mode_alpha != mode_alpha) { glBlendEquationSeparate(mode_rgb, mode_alpha); blend_mode_rgb = mode_rgb; @@ -429,7 +900,7 @@ void gl_rend_state_struct::set_blend_equation_separate(GLenum mode_rgb, GLenum m } } -void gl_rend_state_struct::set_color_mask(GLboolean red, GLboolean green, +void gl_rend_state::set_color_mask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha, bool force) { if (force || color_mask[0] != red || color_mask[1] != green || color_mask[2] != blue || color_mask[3] != alpha) { @@ -441,35 +912,35 @@ void gl_rend_state_struct::set_color_mask(GLboolean red, GLboolean green, } } -void gl_rend_state_struct::set_cull_face_mode(GLenum mode, bool force) { +void gl_rend_state::set_cull_face_mode(GLenum mode, bool force) { if (force || cull_face_mode != mode) { glCullFace(mode); cull_face_mode = mode; } } -void gl_rend_state_struct::set_depth_func(GLenum func, bool force) { +void gl_rend_state::set_depth_func(GLenum func, bool force) { if (force || depth_func != func) { glDepthFunc(func); depth_func = func; } } -void gl_rend_state_struct::set_depth_mask(GLboolean flag, bool force) { +void gl_rend_state::set_depth_mask(GLboolean flag, bool force) { if (force || depth_mask != flag) { glDepthMask(flag); depth_mask = flag; } } -void gl_rend_state_struct::set_line_width(GLfloat width, bool force) { +void gl_rend_state::set_line_width(GLfloat width, bool force) { if (force || line_width != width) { glLineWidth(width); line_width = width; } } -void gl_rend_state_struct::set_polygon_mode(GLenum face, GLenum mode, bool force) { +void gl_rend_state::set_polygon_mode(GLenum face, GLenum mode, bool force) { switch (face) { case GL_FRONT: if (force || polygon_mode != mode) { @@ -492,14 +963,14 @@ void gl_rend_state_struct::set_polygon_mode(GLenum face, GLenum mode, bool force } } -void gl_rend_state_struct::set_primitive_restart_index(GLuint index, bool force) { +void gl_rend_state::set_primitive_restart_index(GLuint index, bool force) { if (force || primitive_restart_index != index) { glPrimitiveRestartIndex(index); primitive_restart_index = index; } } -void gl_rend_state_struct::set_scissor(const gl_rend_state_rect& rect, bool force) { +void gl_rend_state::set_scissor(const gl_rend_state_rect& rect, bool force) { if (force || scissor_box.x != rect.x || scissor_box.y != rect.y || scissor_box.width != rect.width || scissor_box.height != rect.height) { glScissor(rect.x, rect.y, rect.width, rect.height); @@ -507,7 +978,7 @@ void gl_rend_state_struct::set_scissor(const gl_rend_state_rect& rect, bool forc } } -void gl_rend_state_struct::set_scissor(GLint x, GLint y, GLsizei width, GLsizei height, bool force) { +void gl_rend_state::set_scissor(GLint x, GLint y, GLsizei width, GLsizei height, bool force) { if (force || scissor_box.x != x || scissor_box.y != y || scissor_box.width != width || scissor_box.height != height) { glScissor(x, y, width, height); @@ -518,7 +989,7 @@ void gl_rend_state_struct::set_scissor(GLint x, GLint y, GLsizei width, GLsizei } } -void gl_rend_state_struct::set_stencil_func(GLenum func, GLint ref, GLuint mask, bool force) { +void gl_rend_state::set_stencil_func(GLenum func, GLint ref, GLuint mask, bool force) { if (force || stencil_func != func || stencil_ref != ref || stencil_value_mask != mask) { glStencilFunc(func, ref, mask); stencil_func = func; @@ -527,14 +998,14 @@ void gl_rend_state_struct::set_stencil_func(GLenum func, GLint ref, GLuint mask, } } -void gl_rend_state_struct::set_stencil_mask(GLuint mask, bool force) { +void gl_rend_state::set_stencil_mask(GLuint mask, bool force) { if (force || stencil_mask != mask) { glStencilMask(mask); stencil_mask = mask; } } -void gl_rend_state_struct::set_stencil_op(GLenum sfail, GLenum dpfail, GLenum dppass, bool force) { +void gl_rend_state::set_stencil_op(GLenum sfail, GLenum dpfail, GLenum dppass, bool force) { if (force || stencil_fail != sfail || stencil_dpfail != dpfail || stencil_dppass != dppass) { glStencilOp(sfail, dpfail, dppass); stencil_fail = sfail; @@ -543,7 +1014,7 @@ void gl_rend_state_struct::set_stencil_op(GLenum sfail, GLenum dpfail, GLenum dp } } -void gl_rend_state_struct::set_viewport(const gl_rend_state_rect& rect, bool force) { +void gl_rend_state::set_viewport(const gl_rend_state_rect& rect, bool force) { if (force || viewport.x != rect.x || viewport.y != rect.y || viewport.width != rect.width || viewport.height != rect.height) { glViewport(rect.x, rect.y, rect.width, rect.height); @@ -551,7 +1022,7 @@ void gl_rend_state_struct::set_viewport(const gl_rend_state_rect& rect, bool for } } -void gl_rend_state_struct::set_viewport(GLint x, GLint y, GLsizei width, GLsizei height, bool force) { +void gl_rend_state::set_viewport(GLint x, GLint y, GLsizei width, GLsizei height, bool force) { if (force || viewport.x != x || viewport.y != y || viewport.width != width || viewport.height != height) { glViewport(x, y, width, height); @@ -562,7 +1033,7 @@ void gl_rend_state_struct::set_viewport(GLint x, GLint y, GLsizei width, GLsizei } } -void gl_rend_state_struct::use_program(GLuint program, bool force) { +void gl_rend_state::use_program(GLuint program, bool force) { if (force || this->program != program) { glUseProgram(program); this->program = program; diff --git a/src/CRE/gl_rend_state.hpp b/src/CRE/gl_rend_state.hpp index 8553ad1e..af7e3fcd 100644 --- a/src/CRE/gl_rend_state.hpp +++ b/src/CRE/gl_rend_state.hpp @@ -8,6 +8,8 @@ #include "../KKdLib/default.hpp" #include "gl.hpp" +constexpr int32_t GL_REND_STATE_COUNT = 4; + struct gl_rend_state_rect { GLint x; GLint y; @@ -15,58 +17,15 @@ struct gl_rend_state_rect { GLsizei height; }; -struct gl_rend_state_struct { - GLuint program; - GLuint active_texture_index; - GLuint texture_binding_2d[32]; - GLuint texture_binding_cube_map[32]; - GLuint sampler_binding[32]; - GLboolean blend; - GLenum blend_src_rgb; - GLenum blend_src_alpha; - GLenum blend_dst_rgb; - GLenum blend_dst_alpha; - GLenum blend_mode_rgb; - GLenum blend_mode_alpha; - GLuint read_framebuffer_binding; - GLuint draw_framebuffer_binding; - GLuint vertex_array_binding; - GLuint array_buffer_binding; - GLuint element_array_buffer_binding; - GLuint uniform_buffer_binding; - GLuint uniform_buffer_bindings[14]; - GLintptr uniform_buffer_offsets[14]; - GLsizeiptr uniform_buffer_sizes[14]; - GLuint shader_storage_buffer_binding; - GLuint shader_storage_buffer_bindings[14]; - GLintptr shader_storage_buffer_offsets[14]; - GLsizeiptr shader_storage_buffer_sizes[14]; - GLboolean color_mask[4]; - GLboolean cull_face; - GLenum cull_face_mode; - GLboolean depth_test; - GLenum depth_func; - GLboolean depth_mask; - GLfloat line_width; - GLenum polygon_mode; - GLboolean multisample; - GLboolean primitive_restart; - GLuint primitive_restart_index; - gl_rend_state_rect scissor_box; - GLboolean scissor_test; - GLboolean stencil_test; - GLenum stencil_func; - GLenum stencil_fail; - GLenum stencil_dpfail; - GLenum stencil_dppass; - GLuint stencil_mask; - GLint stencil_ref; - GLuint stencil_value_mask; - gl_rend_state_rect viewport; +struct p_gl_rend_state { + struct gl_rend_state& ptr; + + p_gl_rend_state(int32_t index); void active_bind_texture_2d(int32_t index, GLuint texture, bool force = false); void active_bind_texture_cube_map(int32_t index, GLuint texture, bool force = false); void active_texture(size_t index, bool force = false); + void begin_event(const char* message, int32_t length); void bind_framebuffer(GLuint framebuffer, bool force = false); void bind_read_framebuffer(GLuint framebuffer, bool force = false); void bind_draw_framebuffer(GLuint framebuffer, bool force = false); @@ -98,6 +57,11 @@ struct gl_rend_state_struct { void disable_primitive_restart(bool force = false); void disable_scissor_test(bool force = false); void disable_stencil_test(bool force = false); + void draw_arrays(GLenum mode, GLint first, GLsizei count); + void draw_elements(GLenum mode, + GLsizei count, GLenum type, const void* indices); + void draw_range_elements(GLenum mode, + GLuint start, GLuint end, GLsizei count, GLenum type, const void* indices); void enable_blend(bool force = false); void enable_cull_face(bool force = false); void enable_depth_test(bool force = false); @@ -105,6 +69,7 @@ struct gl_rend_state_struct { void enable_primitive_restart(bool force = false); void enable_scissor_test(bool force = false); void enable_stencil_test(bool force = false); + void end_event(); void get(); GLuint get_program(); gl_rend_state_rect get_scissor(); @@ -136,12 +101,6 @@ struct gl_rend_state_struct { template inline void begin_event(const char(&str)[size]) { - glPushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 0, (GLsizei)(size - 1), str); - } - - inline void end_event() { - glPopDebugGroup(); + begin_event(str, (GLsizei)(size - 1)); } }; - -extern gl_rend_state_struct gl_rend_state; diff --git a/src/CRE/gl_state.cpp b/src/CRE/gl_state.cpp new file mode 100644 index 00000000..9013b7e2 --- /dev/null +++ b/src/CRE/gl_state.cpp @@ -0,0 +1,110 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#include "gl_state.hpp" + +gl_state_struct gl_state; + +void gl_state_struct::bind_framebuffer(GLuint framebuffer, bool force) { + if (force || read_framebuffer_binding != framebuffer + || draw_framebuffer_binding != framebuffer) { + glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); + read_framebuffer_binding = framebuffer; + draw_framebuffer_binding = framebuffer; + } +} + +void gl_state_struct::bind_read_framebuffer(GLuint framebuffer, bool force) { + if (force || read_framebuffer_binding != framebuffer) { + glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer); + read_framebuffer_binding = framebuffer; + } +} + +void gl_state_struct::bind_draw_framebuffer(GLuint framebuffer, bool force) { + if (force || draw_framebuffer_binding != framebuffer) { + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer); + draw_framebuffer_binding = framebuffer; + } +} + +void gl_state_struct::bind_vertex_array(GLuint array, bool force) { + if (force || vertex_array_binding != array) { + glBindVertexArray(array); + vertex_array_binding = array; + } +} + +void gl_state_struct::bind_array_buffer(GLuint buffer, bool force) { + if (force || array_buffer_binding != buffer) { + glBindBuffer(GL_ARRAY_BUFFER, buffer); + array_buffer_binding = buffer; + } +} + +void gl_state_struct::bind_element_array_buffer(GLuint buffer, bool force) { + if (force || element_array_buffer_binding != buffer) { + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer); + element_array_buffer_binding = buffer; + } +} + +void gl_state_struct::bind_uniform_buffer(GLuint buffer, bool force) { + if (force || uniform_buffer_binding != buffer) { + glBindBuffer(GL_UNIFORM_BUFFER, buffer); + uniform_buffer_binding = buffer; + } +} + +void gl_state_struct::bind_shader_storage_buffer(GLuint buffer, bool force) { + if (force || shader_storage_buffer_binding != buffer) { + glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer); + shader_storage_buffer_binding = buffer; + } +} + +void gl_state_struct::bind_texture_2d(GLuint texture, bool force) { + if (texture_binding_2d != texture) { + glBindTexture(GL_TEXTURE_2D, texture); + texture_binding_2d = texture; + } +} + +void gl_state_struct::bind_texture_cube_map(GLuint texture, bool force) { + if (force || texture_binding_cube_map != texture) { + glBindTexture(GL_TEXTURE_CUBE_MAP, texture); + texture_binding_cube_map = texture; + } +} + +bool gl_state_struct::check_uniform_buffer_binding() { + return uniform_buffer_binding != 0; +} + +bool gl_state_struct::check_shader_storage_buffer_binding() { + return shader_storage_buffer_binding != 0; +} + +bool gl_state_struct::check_texture_binding_2d() { + return texture_binding_2d != 0; +} + +bool gl_state_struct::check_texture_binding_cube_map() { + return texture_binding_cube_map != 0; +} + +void gl_state_struct::get() { + glGetIntegerv(GL_TEXTURE_BINDING_2D, (GLint*)&texture_binding_2d); + glGetIntegerv(GL_TEXTURE_BINDING_CUBE_MAP, (GLint*)&texture_binding_cube_map); + + glGetIntegerv(GL_READ_FRAMEBUFFER_BINDING, (GLint*)&read_framebuffer_binding); + glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, (GLint*)&draw_framebuffer_binding); + glGetIntegerv(GL_VERTEX_ARRAY_BINDING, (GLint*)&vertex_array_binding); + glGetIntegerv(GL_ARRAY_BUFFER_BINDING, (GLint*)&array_buffer_binding); + glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, (GLint*)&element_array_buffer_binding); + + glGetIntegerv(GL_UNIFORM_BUFFER_BINDING, (GLint*)&uniform_buffer_binding); + glGetIntegerv(GL_SHADER_STORAGE_BUFFER_BINDING, (GLint*)&shader_storage_buffer_binding); +} diff --git a/src/CRE/gl_state.hpp b/src/CRE/gl_state.hpp new file mode 100644 index 00000000..ce07a549 --- /dev/null +++ b/src/CRE/gl_state.hpp @@ -0,0 +1,39 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#pragma once + +#include "../KKdLib/default.hpp" +#include "gl.hpp" + +struct gl_state_struct { + GLuint texture_binding_2d; + GLuint texture_binding_cube_map; + GLuint read_framebuffer_binding; + GLuint draw_framebuffer_binding; + GLuint vertex_array_binding; + GLuint array_buffer_binding; + GLuint element_array_buffer_binding; + GLuint uniform_buffer_binding; + GLuint shader_storage_buffer_binding; + + void bind_framebuffer(GLuint framebuffer, bool force = false); + void bind_read_framebuffer(GLuint framebuffer, bool force = false); + void bind_draw_framebuffer(GLuint framebuffer, bool force = false); + void bind_vertex_array(GLuint array, bool force = false); + void bind_array_buffer(GLuint buffer, bool force = false); + void bind_element_array_buffer(GLuint buffer, bool force = false); + void bind_uniform_buffer(GLuint buffer, bool force = false); + void bind_shader_storage_buffer(GLuint buffer, bool force = false); + void bind_texture_2d(GLuint texture, bool force = false); + void bind_texture_cube_map(GLuint texture, bool force = false); + bool check_uniform_buffer_binding(); + bool check_shader_storage_buffer_binding(); + bool check_texture_binding_2d(); + bool check_texture_binding_cube_map(); + void get(); +}; + +extern gl_state_struct gl_state; diff --git a/src/CRE/light_param.cpp b/src/CRE/light_param.cpp index bcc94207..2a691ac5 100644 --- a/src/CRE/light_param.cpp +++ b/src/CRE/light_param.cpp @@ -7,6 +7,7 @@ #include "../KKdLib/farc.hpp" #include "../KKdLib/hash.hpp" #include "../KKdLib/str_utils.hpp" +#include "gl_state.hpp" #include "render_context.hpp" #include "stage_param.hpp" @@ -151,14 +152,8 @@ void light_param_data_storage_data_set_default_light_param(light_param_data_stor light_param_data_storage_data->default_light_param.set(light_param_data_storage_data, flags); } -void light_param_data_storage_data_set_ibl() { - static const int32_t ibl_texture_index[] = { - 9, 10, 11, 12, 13 - }; - - for (int32_t i = 0; i < 5; i++) - gl_rend_state.active_bind_texture_cube_map(ibl_texture_index[i], - light_param_data_storage_data->textures[i]); +const GLuint* light_param_data_storage_data_get_ibl_textures() { + return light_param_data_storage_data->textures; } void light_param_data_storage_data_set_pv_id(int32_t pv_id) { @@ -509,7 +504,7 @@ void light_param_data::set_ibl(const light_param_ibl* ibl, const light_param_dat return; for (int32_t i = 0, j = -1; i < 5; i++, j++) { - glBindTexture(GL_TEXTURE_CUBE_MAP, storage->textures[i]); + gl_state.bind_texture_cube_map(storage->textures[i]); 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); @@ -528,7 +523,7 @@ void light_param_data::set_ibl(const light_param_ibl* ibl, const light_param_dat light_param_data::set_ibl_specular(&ibl->specular[j]); } } - glBindTexture(GL_TEXTURE_CUBE_MAP, 0); + gl_state.bind_texture_cube_map(0); ::light_set* set = &rctx_ptr->light_set[LIGHT_SET_MAIN]; set->set_irradiance(ibl->diff_coef[1][0], ibl->diff_coef[1][1], ibl->diff_coef[1][2]); diff --git a/src/CRE/light_param.hpp b/src/CRE/light_param.hpp index 9a892854..4c79a679 100644 --- a/src/CRE/light_param.hpp +++ b/src/CRE/light_param.hpp @@ -31,9 +31,6 @@ enum light_param_data_storage_flags { extern void light_param_data_storage_data_init(); extern void light_param_data_storage_data_free_file_handlers(); -#if DISPLAY_IBL -extern GLuint light_param_data_storage_data_get_ibl_texture(int32_t index); -#endif extern std::string light_param_data_storage_data_get_name(); extern int32_t light_param_data_storage_data_get_pv_id(); extern int32_t light_param_data_storage_data_get_stage_index(); @@ -47,7 +44,7 @@ extern void light_param_data_storage_data_load_stages( extern void light_param_data_storage_data_reset(); extern void light_param_data_storage_data_set_default_light_param( light_param_data_storage_flags flags = LIGHT_PARAM_DATA_STORAGE_ALL); -extern void light_param_data_storage_data_set_ibl(); +extern const GLuint* light_param_data_storage_data_get_ibl_textures(); extern void light_param_data_storage_data_set_pv_id(int32_t pv_id); extern void light_param_data_storage_data_set_pv_cut(int32_t cut_id, light_param_data_storage_flags flags = LIGHT_PARAM_DATA_STORAGE_ALL); diff --git a/src/CRE/light_param/fog.cpp b/src/CRE/light_param/fog.cpp index c1c092a6..300a620b 100644 --- a/src/CRE/light_param/fog.cpp +++ b/src/CRE/light_param/fog.cpp @@ -64,13 +64,11 @@ void fog::set_color(const vec4& value) { color = value; } -void fog::data_set(fog_id id) { +void fog::data_set(render_data_context& rend_data_ctx, fog_id id) { fog_type type = get_type(); if (type == FOG_NONE) return; - extern render_context* rctx_ptr; - switch (id) { case FOG_DEPTH: { float_t density = get_density(); @@ -81,13 +79,13 @@ void fog::data_set(fog_id id) { vec4 color; get_color(color); - render_context::fog_params params = {}; - rctx_ptr->get_scene_fog_params(params); + render_data_context::fog_params params = {}; + rend_data_ctx.get_scene_fog_params(params); params.density = density; params.start = start; params.end = end; params.depth_color = color; - rctx_ptr->set_scene_fog_params(params); + rend_data_ctx.set_scene_fog_params(params); } break; case FOG_HEIGHT: { float_t density = get_density(); @@ -98,14 +96,14 @@ void fog::data_set(fog_id id) { vec4 color; get_color(color); - render_context::fog_params params = {}; - rctx_ptr->get_scene_fog_params(params); + render_data_context::fog_params params = {}; + rend_data_ctx.get_scene_fog_params(params); params.height_params.x = density; params.height_params.y = start; params.height_params.z = end; params.height_params.w = 1.0f / (end - start); params.height_color = color; - rctx_ptr->set_scene_fog_params(params); + rend_data_ctx.set_scene_fog_params(params); } break; case FOG_BUMP: { float_t density = get_density(); @@ -114,13 +112,13 @@ void fog::data_set(fog_id id) { if (start >= end) start = end - 0.01f; - render_context::fog_params params = {}; - rctx_ptr->get_scene_fog_params(params); + render_data_context::fog_params params = {}; + rend_data_ctx.get_scene_fog_params(params); params.bump_params.x = density; params.bump_params.y = start; params.bump_params.z = end; params.bump_params.w = 1.0f / (end - start); - rctx_ptr->set_scene_fog_params(params); + rend_data_ctx.set_scene_fog_params(params); } break; } } diff --git a/src/CRE/light_param/fog.hpp b/src/CRE/light_param/fog.hpp index 22e56fb6..596c01c9 100644 --- a/src/CRE/light_param/fog.hpp +++ b/src/CRE/light_param/fog.hpp @@ -32,5 +32,5 @@ struct fog { void set_index(int32_t value); void get_color(vec4& value) const; void set_color(const vec4& value); - void data_set(fog_id id); + void data_set(struct render_data_context& rend_data_ctx, fog_id id); }; diff --git a/src/CRE/light_param/light.cpp b/src/CRE/light_param/light.cpp index a79ce537..0e928817 100644 --- a/src/CRE/light_param/light.cpp +++ b/src/CRE/light_param/light.cpp @@ -259,7 +259,7 @@ void light_set::set_irradiance(const mat4&& r, const mat4&& g, const mat4&& b) { irradiance_b = b; } -void light_set::data_set(face& face, light_set_id id) { +void light_set::data_set(render_data_context& rend_data_ctx, face& face, light_set_id id) { static const float_t spec_coef = (float_t)(1.0 / (1.0 - cos(18.0 * DEG_TO_RAD))); static const float_t luce_coef = (float_t)(1.0 / (1.0 - cos(45.0 * DEG_TO_RAD))); @@ -346,7 +346,7 @@ void light_set::data_set(face& face, light_set_id id) { vec4 chara_f_diffuse; vec4 chara_tc_param; if (lights[LIGHT_TONE_CURVE].get_type() == LIGHT_PARALLEL) { - uniform_value[U_TONE_CURVE] = 1; + rend_data_ctx.shader_flags.arr[U_TONE_CURVE] = 1; lights[LIGHT_TONE_CURVE].get_position(chara_f_dir); light_get_direction_from_position(&chara_f_dir, &lights[LIGHT_TONE_CURVE]); lights[LIGHT_TONE_CURVE].get_ambient(chara_f_ambient); @@ -364,7 +364,7 @@ void light_set::data_set(face& face, light_set_id id) { chara_tc_param.w = 0.0f; } else { - uniform_value[U_TONE_CURVE] = 0; + rend_data_ctx.shader_flags.arr[U_TONE_CURVE] = 0; chara_f_dir = { 0.0f, 1.0f, 0.0f, 0.0f }; chara_f_ambient = 0.0f; chara_f_diffuse = 0.0f; @@ -427,8 +427,7 @@ void light_set::data_set(face& face, light_set_id id) { } } - extern render_context* rctx_ptr; - rctx_ptr->set_scene_light(irradiance_r_transforms, irradiance_g_transforms, irradiance_b_transforms, + rend_data_ctx.set_scene_light(irradiance_r_transforms, irradiance_g_transforms, irradiance_b_transforms, light_env_stage_diffuse, light_env_stage_specular, light_env_chara_diffuse, light_env_chara_ambient, light_env_chara_specular, light_env_reflect_diffuse, light_env_reflect_ambient, @@ -439,6 +438,15 @@ void light_set::data_set(face& face, light_set_id id) { chara_color0, chara_color1, chara_f_dir, chara_f_ambient, chara_f_diffuse, chara_tc_param, normal_tangent_transforms, light_reflect_dir, clip_plane, npr_cloth_spec_color); + + extern const GLuint* light_param_data_storage_data_get_ibl_textures(); + const GLuint* textures = light_param_data_storage_data_get_ibl_textures(); + static const int32_t ibl_texture_index[] = { + 9, 10, 11, 12, 13 + }; + + for (int32_t i = 0; i < 5; i++) + rend_data_ctx.state.active_bind_texture_cube_map(ibl_texture_index[i], textures[i]); } static void light_get_direction_from_position(vec4* pos_dir, light_data* light, bool force) { diff --git a/src/CRE/light_param/light.hpp b/src/CRE/light_param/light.hpp index c1fabd7d..9fa8acd4 100644 --- a/src/CRE/light_param/light.hpp +++ b/src/CRE/light_param/light.hpp @@ -85,5 +85,5 @@ struct light_set { void get_irradiance(mat4& r, mat4& g, mat4& b); void set_irradiance(const mat4& r, const mat4& g, const mat4& b); void set_irradiance(const mat4&& r, const mat4&& g, const mat4&& b); - void data_set(face& face, light_set_id id); + void data_set(struct render_data_context& rend_data_ctx, face& face, light_set_id id); }; diff --git a/src/CRE/mdl/disp_manager.cpp b/src/CRE/mdl/disp_manager.cpp index d136e46d..7ae8b1f4 100644 --- a/src/CRE/mdl/disp_manager.cpp +++ b/src/CRE/mdl/disp_manager.cpp @@ -7,6 +7,7 @@ #include "../../KKdLib/database/stage.hpp" #include "../Glitter/glitter.hpp" #include "../config.hpp" +#include "../gl_state.hpp" #include "../render_context.hpp" #include "../shader_ft.hpp" #include "draw_object.hpp" @@ -301,15 +302,15 @@ namespace mdl { morph_vertex_buffer = 0; morph_vertex_buffer_offset = 0; - glBindVertexArray(vertex_array); + gl_state.bind_vertex_array(vertex_array); for (int32_t i = 0; i < 16; i++) if (vertex_attrib_array[i]) { glDisableVertexAttribArray(i); vertex_attrib_array[i] = false; } - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); - glBindVertexArray(0); + gl_state.bind_array_buffer(0); + gl_state.bind_element_array_buffer(0); + gl_state.bind_vertex_array(0); } DispManager::DispManager() : obj_flags(), shadow_type(), field_8(), field_C(), @@ -418,7 +419,7 @@ namespace mdl { if (!vertex_array->vertex_array) { glGenVertexArrays(1, &vertex_array->vertex_array); - glBindVertexArray(vertex_array->vertex_array); + gl_state.bind_vertex_array(vertex_array->vertex_array); glVertexAttrib4f( POSITION_INDEX, 0.0f, 0.0f, 0.0f, 1.0f); glVertexAttrib4f( BONE_WEIGHT_INDEX, 0.0f, 0.0f, 0.0f, 0.0f); glVertexAttrib4f( NORMAL_INDEX, 0.0f, 0.0f, 0.0f, 1.0f); @@ -452,10 +453,10 @@ namespace mdl { vertex_attrib_buffer_binding, sizeof(vertex_attrib_buffer_binding)); if (!new_vertex_array) - glBindVertexArray(vertex_array->vertex_array); - glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer); + gl_state.bind_vertex_array(vertex_array->vertex_array); + gl_state.bind_array_buffer(vertex_buffer); if (index_buffer) - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer); + gl_state.bind_element_array_buffer(index_buffer); size_t offset = vertex_buffer_offset; if (vertex_format & OBJ_VERTEX_POSITION) { @@ -694,7 +695,7 @@ namespace mdl { } if (morph_vertex_buffer) { - glBindBuffer(GL_ARRAY_BUFFER, morph_vertex_buffer); + gl_state.bind_array_buffer(morph_vertex_buffer); size_t offset = morph_vertex_buffer_offset; if (vertex_format & OBJ_VERTEX_POSITION) { @@ -845,8 +846,6 @@ namespace mdl { } if (vertex_format & OBJ_VERTEX_COLOR0) { - uniform_value[U_MORPH_COLOR] = 1; - if (!vertex_array->vertex_attrib_array[MORPH_COLOR_INDEX]) { glEnableVertexAttribArray(MORPH_COLOR_INDEX); vertex_array->vertex_attrib_array[MORPH_COLOR_INDEX] = true; @@ -926,10 +925,10 @@ namespace mdl { } } - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindVertexArray(0); + gl_state.bind_array_buffer(0); + gl_state.bind_vertex_array(0); if (index_buffer) - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + gl_state.bind_element_array_buffer(0); } static size_t gen_grid_vertices(std::vector>& data, @@ -1694,7 +1693,7 @@ namespace mdl { if (!etc_vertex_array->vertex_array) { glGenVertexArrays(1, &etc_vertex_array->vertex_array); - glBindVertexArray(etc_vertex_array->vertex_array); + gl_state.bind_vertex_array(etc_vertex_array->vertex_array); glVertexAttrib4f( POSITION_INDEX, 0.0f, 0.0f, 0.0f, 1.0f); glVertexAttrib4f( BONE_WEIGHT_INDEX, 0.0f, 0.0f, 0.0f, 0.0f); glVertexAttrib4f( NORMAL_INDEX, 0.0f, 0.0f, 0.0f, 1.0f); @@ -1834,20 +1833,20 @@ namespace mdl { GLsizei size_vertex = sizeof(vec3) * 2; if (!new_vertex_array) - glBindVertexArray(etc_vertex_array->vertex_array); + gl_state.bind_vertex_array(etc_vertex_array->vertex_array); if (etc_vertex_array->vertex_buffer.IsNull()) - etc_vertex_array->vertex_buffer.Create(sizeof(vec3) * 2 * vtx_data.size()); + etc_vertex_array->vertex_buffer.Create(gl_state, sizeof(vec3) * 2 * vtx_data.size()); - glBindBuffer(GL_ARRAY_BUFFER, etc_vertex_array->vertex_buffer); + gl_state.bind_array_buffer(etc_vertex_array->vertex_buffer); glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vec3) * 2 * vtx_data.size(), vtx_data.data()); if (indexed) { if (etc_vertex_array->index_buffer.IsNull()) - etc_vertex_array->index_buffer.Create(sizeof(uint32_t) * vtx_indices.size()); + etc_vertex_array->index_buffer.Create(gl_state, sizeof(uint32_t) * vtx_indices.size()); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, etc_vertex_array->index_buffer); + gl_state.bind_element_array_buffer(etc_vertex_array->index_buffer); glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, sizeof(uint32_t) * vtx_indices.size(), vtx_indices.data()); } @@ -1860,10 +1859,10 @@ namespace mdl { glVertexAttribPointer(NORMAL_INDEX, 3, GL_FLOAT, GL_FALSE, size_vertex, (void*)sizeof(vec3)); - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindVertexArray(0); + gl_state.bind_array_buffer(0); + gl_state.bind_vertex_array(0); if (indexed) - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + gl_state.bind_element_array_buffer(0); } void* DispManager::alloc_data(int32_t size) { @@ -1900,7 +1899,7 @@ namespace mdl { buff_offset = 0; } - void DispManager::calc_obj_radius(const mat4* view, mdl::ObjType type) { + void DispManager::calc_obj_radius(const cam_data& cam, mdl::ObjType type) { std::vector alpha_center; std::vector mat_center; @@ -1911,9 +1910,9 @@ namespace mdl { case OBJ_KIND_NORMAL: { mat4 mat = i->mat; if (i->args.sub_mesh.mesh->attrib.m.billboard) - model_mat_face_camera_view(view, &mat, &mat); + model_mat_face_camera_view(cam, &mat, &mat); else if (i->args.sub_mesh.mesh->attrib.m.billboard_y_axis) - model_mat_face_camera_position(view, &mat, &mat); + model_mat_face_camera_position(cam, &mat, &mat); get_obj_center(mat, &i->args.sub_mesh, center); @@ -1947,7 +1946,7 @@ namespace mdl { if (show_mat_center && type == OBJ_TYPE_TRANSLUCENT && v50) mat_center.push_back(center); - mat4_transform_point(view, ¢er, ¢er); + mat4_transform_point(&cam.get_view_mat(), ¢er, ¢er); i->view_z = center.z; } @@ -1980,7 +1979,7 @@ namespace mdl { } } - void DispManager::calc_obj_radius(const mat4* view, ObjTypeLocal type) { + void DispManager::calc_obj_radius(const cam_data& cam, ObjTypeLocal type) { for (ObjData*& i : obj_local[type]) { vec3 center = 0.0f; bool v50 = false; @@ -1988,9 +1987,9 @@ namespace mdl { case OBJ_KIND_NORMAL: { mat4 mat = i->mat; if (i->args.sub_mesh.mesh->attrib.m.billboard) - model_mat_face_camera_view(view, &mat, &mat); + model_mat_face_camera_view(cam, &mat, &mat); else if (i->args.sub_mesh.mesh->attrib.m.billboard_y_axis) - model_mat_face_camera_position(view, &mat, &mat); + model_mat_face_camera_position(cam, &mat, &mat); get_obj_center(mat, &i->args.sub_mesh, center); @@ -2015,12 +2014,12 @@ namespace mdl { break; } - mat4_transform_point(view, ¢er, ¢er); + mat4_transform_point(&cam.get_view_mat(), ¢er, ¢er); i->view_z = center.z; } } - void DispManager::calc_obj_radius(const mat4* view, ObjTypeReflect type) { + void DispManager::calc_obj_radius(const cam_data& cam, ObjTypeReflect type) { for (ObjData*& i : obj_reflect[type]) { vec3 center = 0.0f; bool v50 = false; @@ -2028,9 +2027,9 @@ namespace mdl { case OBJ_KIND_NORMAL: { mat4 mat = i->mat; if (i->args.sub_mesh.mesh->attrib.m.billboard) - model_mat_face_camera_view(view, &mat, &mat); + model_mat_face_camera_view(cam, &mat, &mat); else if (i->args.sub_mesh.mesh->attrib.m.billboard_y_axis) - model_mat_face_camera_position(view, &mat, &mat); + model_mat_face_camera_position(cam, &mat, &mat); get_obj_center(mat, &i->args.sub_mesh, center); @@ -2055,7 +2054,7 @@ namespace mdl { break; } - mat4_transform_point(view, ¢er, ¢er); + mat4_transform_point(&cam.get_view_mat(), ¢er, ¢er); i->view_z = center.z; } } @@ -2075,13 +2074,13 @@ namespace mdl { for (DispManager::etc_vertex_array& i : etc_vertex_array_cache) if (i.alive_time > 0 && --i.alive_time <= 0) { - glBindVertexArray(i.vertex_array); + gl_state.bind_vertex_array(i.vertex_array); glDisableVertexAttribArray(POSITION_INDEX); glDisableVertexAttribArray( NORMAL_INDEX); - glBindBuffer(GL_ARRAY_BUFFER, 0); + gl_state.bind_array_buffer(0); if (i.indexed) - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); - glBindVertexArray(0); + gl_state.bind_element_array_buffer(0); + gl_state.bind_vertex_array(0); } } @@ -2092,25 +2091,24 @@ namespace mdl { i.reset_vertex_attrib(); } - void DispManager::draw(ObjType type, int32_t depth_mask, bool reflect_texture_mask, int32_t alpha) { + void DispManager::draw(render_data_context& rend_data_ctx, ObjType type, + const cam_data& cam, int32_t depth_mask, bool reflect_texture_mask, int32_t alpha) { if (type < 0 || type >= OBJ_TYPE_MAX || get_obj_count(type) < 1) return; - render_context* rctx = rctx_ptr; - int32_t alpha_test = 0; float_t min_alpha = 1.0f; float_t alpha_threshold = 0.0f; - bool reflect = uniform_value[U_REFLECT] == 1; - void(*func)(render_context * rctx, const ObjSubMeshArgs * args) = draw_sub_mesh_default; + bool reflect = rend_data_ctx.shader_flags.arr[U_REFLECT] == 1; + void(*func)(render_data_context & rend_data_ctx, const ObjSubMeshArgs * args, + const cam_data & cam, const mat4* mat) = draw_sub_mesh_default; for (int32_t i = 0; i < 5; i++) - gl_rend_state.active_bind_texture_2d(i, rctx->empty_texture_2d->glid); - gl_rend_state.active_bind_texture_cube_map(5, rctx->empty_texture_cube_map->glid); - gl_rend_state.active_texture(0); - gl_rend_state.set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - uniform_value_reset(); - gl_rend_state.get(); + rend_data_ctx.state.active_bind_texture_2d(i, rctx_ptr->empty_texture_2d->glid); + rend_data_ctx.state.active_bind_texture_cube_map(5, rctx_ptr->empty_texture_cube_map->glid); + rend_data_ctx.state.active_texture(0); + rend_data_ctx.state.set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + rend_data_ctx.reset_shader_flags(); switch (type) { case OBJ_TYPE_TRANSLUCENT: @@ -2118,7 +2116,7 @@ namespace mdl { if (depth_mask) func = draw_sub_mesh_translucent; else - gl_rend_state.set_depth_mask(GL_FALSE); + rend_data_ctx.state.set_depth_mask(GL_FALSE); alpha_test = 1; min_alpha = 0.0f; @@ -2137,42 +2135,42 @@ namespace mdl { break; case OBJ_TYPE_TYPE_6: func = draw_sub_mesh_translucent; - gl_rend_state.set_color_mask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); - rctx->draw_state->shader_index = SHADER_FT_SIL; + rend_data_ctx.state.set_color_mask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); + rctx_ptr->draw_state->rend_data[rend_data_ctx.index].shader_index = SHADER_FT_SIL; break; case OBJ_TYPE_TYPE_7: func = draw_sub_mesh_translucent; - gl_rend_state.set_color_mask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); - rctx->draw_state->shader_index = SHADER_FT_SIL; + rend_data_ctx.state.set_color_mask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); + rctx_ptr->draw_state->rend_data[rend_data_ctx.index].shader_index = SHADER_FT_SIL; alpha_test = 1; min_alpha = 0.0f; alpha_threshold = 0.99999994f; break; case OBJ_TYPE_REFLECT_CHARA_OPAQUE: - gl_rend_state.set_cull_face_mode(GL_FRONT); + rend_data_ctx.state.set_cull_face_mode(GL_FRONT); if (!reflect_draw) { if (reflect) func = draw_sub_mesh_reflect; - else if (rctx->render_manager->reflect_type == STAGE_DATA_REFLECT_REFLECT_MAP) + else if (rctx_ptr->render_manager->reflect_type == STAGE_DATA_REFLECT_REFLECT_MAP) func = draw_sub_mesh_reflect_reflect_map; } break; case OBJ_TYPE_REFLECT_CHARA_TRANSLUCENT: - gl_rend_state.set_cull_face_mode(GL_FRONT); + rend_data_ctx.state.set_cull_face_mode(GL_FRONT); min_alpha = 0.0f; if (!reflect_draw) { if (reflect) func = draw_sub_mesh_reflect; - else if (rctx->render_manager->reflect_type == STAGE_DATA_REFLECT_REFLECT_MAP) + else if (rctx_ptr->render_manager->reflect_type == STAGE_DATA_REFLECT_REFLECT_MAP) func = draw_sub_mesh_reflect_reflect_map; } break; case OBJ_TYPE_REFLECT_CHARA_TRANSPARENT: - gl_rend_state.set_cull_face_mode(GL_FRONT); + rend_data_ctx.state.set_cull_face_mode(GL_FRONT); alpha_test = 1; min_alpha = 0.1f; @@ -2181,7 +2179,7 @@ namespace mdl { if (!reflect_draw) { if (reflect) func = draw_sub_mesh_reflect; - else if (rctx->render_manager->reflect_type == STAGE_DATA_REFLECT_REFLECT_MAP) + else if (rctx_ptr->render_manager->reflect_type == STAGE_DATA_REFLECT_REFLECT_MAP) func = draw_sub_mesh_reflect_reflect_map; } break; @@ -2190,18 +2188,18 @@ namespace mdl { alpha_threshold = 0.5f; if (reflect_draw) - gl_rend_state.set_cull_face_mode(GL_FRONT); + rend_data_ctx.state.set_cull_face_mode(GL_FRONT); else if (!reflect_texture_mask) func = draw_sub_mesh_reflect_reflect_map; break; case OBJ_TYPE_REFLECT_TRANSLUCENT: - gl_rend_state.set_depth_mask(GL_FALSE); + rend_data_ctx.state.set_depth_mask(GL_FALSE); min_alpha = 0.0f; alpha_threshold = 0.0f; if (reflect_draw) - gl_rend_state.set_cull_face_mode(GL_FRONT); + rend_data_ctx.state.set_cull_face_mode(GL_FRONT); break; case OBJ_TYPE_REFLECT_TRANSPARENT: alpha_test = 1; @@ -2209,10 +2207,10 @@ namespace mdl { alpha_threshold = 0.5f; if (reflect_draw) - gl_rend_state.set_cull_face_mode(GL_FRONT); + rend_data_ctx.state.set_cull_face_mode(GL_FRONT); break; case OBJ_TYPE_REFRACT_TRANSLUCENT: - gl_rend_state.set_depth_mask(GL_FALSE); + rend_data_ctx.state.set_depth_mask(GL_FALSE); min_alpha = 0.0f; alpha_threshold = 0.0f; @@ -2226,7 +2224,7 @@ namespace mdl { func = draw_sub_mesh_sss; if (reflect_draw) - gl_rend_state.set_cull_face_mode(GL_FRONT); + rend_data_ctx.state.set_cull_face_mode(GL_FRONT); break; case OBJ_TYPE_TRANSPARENT_ALPHA_ORDER_1: case OBJ_TYPE_TRANSPARENT_ALPHA_ORDER_2: @@ -2238,7 +2236,7 @@ namespace mdl { case OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_1: case OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_2: case OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_3: - gl_rend_state.set_depth_mask(GL_FALSE); + rend_data_ctx.state.set_depth_mask(GL_FALSE); alpha_test = 1; min_alpha = 0.0f; @@ -2248,25 +2246,25 @@ namespace mdl { func = draw_sub_mesh_translucent; break; } - rctx->set_batch_alpha_threshold(alpha_threshold); - rctx->set_batch_min_alpha(min_alpha); - uniform_value[U_ALPHA_TEST] = alpha_test; + rend_data_ctx.set_batch_alpha_threshold(alpha_threshold); + rend_data_ctx.set_batch_min_alpha(min_alpha); + rend_data_ctx.shader_flags.arr[U_ALPHA_TEST] = alpha_test; if (alpha < 0) for (ObjData*& i : obj[type]) { switch (i->kind) { case OBJ_KIND_NORMAL: { - draw_sub_mesh(rctx, &i->args.sub_mesh, &i->mat, func); + draw_sub_mesh(rend_data_ctx, &i->args.sub_mesh, &i->mat, func, cam); } break; case OBJ_KIND_ETC: { - draw_etc_obj(rctx, &i->args.etc, &i->mat); + draw_etc_obj(rend_data_ctx, &i->args.etc, &i->mat); } break; case OBJ_KIND_USER: { - i->args.user.func(i->args.user.data, &i->mat); + i->args.user.func(rend_data_ctx, i->args.user.data, cam, &i->mat); } break; case OBJ_KIND_TRANSLUCENT: { for (int32_t j = 0; j < i->args.translucent.count; j++) - draw_sub_mesh(rctx, i->args.translucent.sub_mesh[j], &i->mat, func); + draw_sub_mesh(rend_data_ctx, i->args.translucent.sub_mesh[j], &i->mat, func, cam); } break; } } @@ -2277,7 +2275,7 @@ namespace mdl { int32_t a = (int32_t)(i->args.sub_mesh.blend_color.w * 255.0f); a = clamp_def(a, 0, 255); if (a == alpha) - draw_sub_mesh(rctx, &i->args.sub_mesh, &i->mat, func); + draw_sub_mesh(rend_data_ctx, &i->args.sub_mesh, &i->mat, func, cam); } break; case OBJ_KIND_TRANSLUCENT: { for (int32_t j = 0; j < i->args.translucent.count; j++) { @@ -2285,7 +2283,7 @@ namespace mdl { int32_t a = (int32_t)(args->blend_color.w * 255.0f); a = clamp_def(a, 0, 255); if (a == alpha) - draw_sub_mesh(rctx, args, &i->mat, func); + draw_sub_mesh(rend_data_ctx, args, &i->mat, func, cam); } } break; } @@ -2295,80 +2293,79 @@ namespace mdl { case OBJ_TYPE_TRANSLUCENT: case OBJ_TYPE_TRANSLUCENT_SORT_BY_RADIUS: if (!depth_mask) - gl_rend_state.set_depth_mask(GL_TRUE); + rend_data_ctx.state.set_depth_mask(GL_TRUE); break; case OBJ_TYPE_TYPE_6: case OBJ_TYPE_TYPE_7: - rctx_ptr->draw_state->shader_index = -1; - gl_rend_state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + rctx_ptr->draw_state->rend_data[rend_data_ctx.index].shader_index = -1; + rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); break; case OBJ_TYPE_REFLECT_CHARA_OPAQUE: case OBJ_TYPE_REFLECT_CHARA_TRANSLUCENT: case OBJ_TYPE_REFLECT_CHARA_TRANSPARENT: - gl_rend_state.set_cull_face_mode(GL_BACK); + rend_data_ctx.state.set_cull_face_mode(GL_BACK); break; case OBJ_TYPE_REFLECT_OPAQUE: if (reflect_draw) - gl_rend_state.set_cull_face_mode(GL_FRONT); + rend_data_ctx.state.set_cull_face_mode(GL_FRONT); break; case OBJ_TYPE_REFLECT_TRANSLUCENT: if (reflect_draw) - gl_rend_state.set_cull_face_mode(GL_FRONT); - gl_rend_state.set_depth_mask(GL_TRUE); + rend_data_ctx.state.set_cull_face_mode(GL_FRONT); + rend_data_ctx.state.set_depth_mask(GL_TRUE); break; case OBJ_TYPE_REFLECT_TRANSPARENT: if (reflect_draw) - gl_rend_state.set_cull_face_mode(GL_FRONT); + rend_data_ctx.state.set_cull_face_mode(GL_FRONT); break; case OBJ_TYPE_REFRACT_TRANSLUCENT: if (reflect_draw) - gl_rend_state.set_cull_face_mode(GL_FRONT); - gl_rend_state.set_depth_mask(GL_TRUE); + rend_data_ctx.state.set_cull_face_mode(GL_FRONT); + rend_data_ctx.state.set_depth_mask(GL_TRUE); break; case OBJ_TYPE_SSS: if (reflect_draw) - gl_rend_state.set_cull_face_mode(GL_BACK); + rend_data_ctx.state.set_cull_face_mode(GL_BACK); break; case OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_1: case OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_2: case OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_3: - gl_rend_state.set_depth_mask(GL_TRUE); + rend_data_ctx.state.set_depth_mask(GL_TRUE); break; } - uniform_value_reset(); - gl_rend_state.bind_vertex_array(0); - shader::unbind(); - gl_rend_state.set_blend_func(GL_ONE, GL_ZERO); + rend_data_ctx.reset_shader_flags(); + rend_data_ctx.state.bind_vertex_array(0); + shader::unbind(rend_data_ctx.state); + rend_data_ctx.state.set_blend_func(GL_ONE, GL_ZERO); for (int32_t i = 0; i < 5; i++) - gl_rend_state.bind_sampler(i, 0); + rend_data_ctx.state.bind_sampler(i, 0); } - void DispManager::draw(mdl::ObjTypeLocal type, int32_t depth_mask, bool reflect_texture_mask) { + void DispManager::draw(render_data_context& rend_data_ctx, mdl::ObjTypeLocal type, + const cam_data& cam, int32_t depth_mask, bool reflect_texture_mask) { if (type < 0 || type >= OBJ_TYPE_LOCAL_MAX || get_obj_count(type) < 1) return; - render_context* rctx = rctx_ptr; - int32_t alpha_test = 0; float_t min_alpha = 1.0f; float_t alpha_threshold = 0.0f; - void(*func)(render_context * rctx, const ObjSubMeshArgs * args) = draw_sub_mesh_default; + void(*func)(render_data_context & rend_data_ctx, const ObjSubMeshArgs * args, + const cam_data & cam, const mat4 * mat) = draw_sub_mesh_default; for (int32_t i = 0; i < 5; i++) - gl_rend_state.active_bind_texture_2d(i, rctx->empty_texture_2d->glid); - gl_rend_state.active_bind_texture_cube_map(5, rctx->empty_texture_cube_map->glid); - gl_rend_state.active_texture(0); - gl_rend_state.set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - uniform_value_reset(); - gl_rend_state.get(); + rend_data_ctx.state.active_bind_texture_2d(i, rctx_ptr->empty_texture_2d->glid); + rend_data_ctx.state.active_bind_texture_cube_map(5, rctx_ptr->empty_texture_cube_map->glid); + rend_data_ctx.state.active_texture(0); + rend_data_ctx.state.set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + rend_data_ctx.reset_shader_flags(); switch (type) { case OBJ_TYPE_LOCAL_TRANSLUCENT: if (depth_mask) func = draw_sub_mesh_translucent; else - gl_rend_state.set_depth_mask(GL_FALSE); + rend_data_ctx.state.set_depth_mask(GL_FALSE); alpha_test = 1; min_alpha = 0.0f; @@ -2380,18 +2377,18 @@ namespace mdl { alpha_threshold = 0.5f; break; } - rctx->set_batch_alpha_threshold(alpha_threshold); - rctx->set_batch_min_alpha(min_alpha); - uniform_value[U_ALPHA_TEST] = alpha_test; + rend_data_ctx.set_batch_alpha_threshold(alpha_threshold); + rend_data_ctx.set_batch_min_alpha(min_alpha); + rend_data_ctx.shader_flags.arr[U_ALPHA_TEST] = alpha_test; for (ObjData*& i : obj_local[type]) { switch (i->kind) { case OBJ_KIND_NORMAL: { - draw_sub_mesh(rctx, &i->args.sub_mesh, &i->mat, func); + draw_sub_mesh(rend_data_ctx, &i->args.sub_mesh, &i->mat, func, cam); } break; case OBJ_KIND_TRANSLUCENT: { for (int32_t j = 0; j < i->args.translucent.count; j++) - draw_sub_mesh(rctx, i->args.translucent.sub_mesh[j], &i->mat, func); + draw_sub_mesh(rend_data_ctx, i->args.translucent.sub_mesh[j], &i->mat, func, cam); } break; } } @@ -2399,64 +2396,63 @@ namespace mdl { switch (type) { case OBJ_TYPE_LOCAL_TRANSLUCENT: if (!depth_mask) - gl_rend_state.set_depth_mask(GL_TRUE); + rend_data_ctx.state.set_depth_mask(GL_TRUE); break; } - uniform_value_reset(); - gl_rend_state.bind_vertex_array(0); - shader::unbind(); - gl_rend_state.set_blend_func(GL_ONE, GL_ZERO); + rend_data_ctx.reset_shader_flags(); + rend_data_ctx.state.bind_vertex_array(0); + shader::unbind(rend_data_ctx.state); + rend_data_ctx.state.set_blend_func(GL_ONE, GL_ZERO); for (int32_t i = 0; i < 5; i++) - gl_rend_state.bind_sampler(i, 0); + rend_data_ctx.state.bind_sampler(i, 0); } - void DispManager::draw(mdl::ObjTypeReflect type, int32_t depth_mask, bool reflect_texture_mask) { + void DispManager::draw(render_data_context& rend_data_ctx, mdl::ObjTypeReflect type, + const cam_data& cam, int32_t depth_mask, bool reflect_texture_mask) { if (type < 0 || type >= OBJ_TYPE_REFLECT_MAX || get_obj_count(type) < 1) return; - render_context* rctx = rctx_ptr; - int32_t alpha_test = 0; float_t min_alpha = 1.0f; float_t alpha_threshold = 0.0f; - bool reflect = uniform_value[U_REFLECT] == 1; - void(*func)(render_context * rctx, const ObjSubMeshArgs * args) = draw_sub_mesh_default; + bool reflect = rend_data_ctx.shader_flags.arr[U_REFLECT] == 1; + void(*func)(render_data_context & rend_data_ctx, const ObjSubMeshArgs * args, + const cam_data & cam, const mat4 * mat) = draw_sub_mesh_default; for (int32_t i = 0; i < 5; i++) - gl_rend_state.active_bind_texture_2d(i, rctx->empty_texture_2d->glid); - gl_rend_state.active_bind_texture_cube_map(5, rctx->empty_texture_cube_map->glid); - gl_rend_state.active_texture(0); - gl_rend_state.set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - uniform_value_reset(); - gl_rend_state.get(); + rend_data_ctx.state.active_bind_texture_2d(i, rctx_ptr->empty_texture_2d->glid); + rend_data_ctx.state.active_bind_texture_cube_map(5, rctx_ptr->empty_texture_cube_map->glid); + rend_data_ctx.state.active_texture(0); + rend_data_ctx.state.set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + rend_data_ctx.reset_shader_flags(); switch (type) { case OBJ_TYPE_REFLECT_TRANSLUCENT_SORT_BY_RADIUS: if (depth_mask) func = draw_sub_mesh_translucent; else - gl_rend_state.set_depth_mask(GL_FALSE); + rend_data_ctx.state.set_depth_mask(GL_FALSE); alpha_test = 1; min_alpha = 0.0f; alpha_threshold = 0.0f; - gl_rend_state.set_cull_face_mode(GL_FRONT); + rend_data_ctx.state.set_cull_face_mode(GL_FRONT); break; } - rctx->set_batch_alpha_threshold(alpha_threshold); - rctx->set_batch_min_alpha(min_alpha); - uniform_value[U_ALPHA_TEST] = alpha_test; + rend_data_ctx.set_batch_alpha_threshold(alpha_threshold); + rend_data_ctx.set_batch_min_alpha(min_alpha); + rend_data_ctx.shader_flags.arr[U_ALPHA_TEST] = alpha_test; for (ObjData*& i : obj_reflect[type]) { switch (i->kind) { case OBJ_KIND_NORMAL: { - draw_sub_mesh(rctx, &i->args.sub_mesh, &i->mat, func); + draw_sub_mesh(rend_data_ctx, &i->args.sub_mesh, &i->mat, func, cam); } break; case OBJ_KIND_TRANSLUCENT: { for (int32_t j = 0; j < i->args.translucent.count; j++) - draw_sub_mesh(rctx, i->args.translucent.sub_mesh[j], &i->mat, func); + draw_sub_mesh(rend_data_ctx, i->args.translucent.sub_mesh[j], &i->mat, func, cam); } break; } } @@ -2464,48 +2460,18 @@ namespace mdl { switch (type) { case OBJ_TYPE_REFLECT_TRANSLUCENT_SORT_BY_RADIUS: if (!depth_mask) - gl_rend_state.set_cull_face_mode(GL_BACK); + rend_data_ctx.state.set_cull_face_mode(GL_BACK); break; } - uniform_value_reset(); - gl_rend_state.bind_vertex_array(0); - shader::unbind(); - gl_rend_state.set_blend_func(GL_ONE, GL_ZERO); + rend_data_ctx.reset_shader_flags(); + rend_data_ctx.state.bind_vertex_array(0); + shader::unbind(rend_data_ctx.state); + rend_data_ctx.state.set_blend_func(GL_ONE, GL_ZERO); for (int32_t i = 0; i < 5; i++) - gl_rend_state.bind_sampler(i, 0); + rend_data_ctx.state.bind_sampler(i, 0); } - /*void DispManager::draw_show_vector(ObjType type, int32_t show_vector) { - if (get_obj_count(type) < 1) - return; - - render_context* rctx = rctx_ptr; - - for (int32_t i = 0; i < 5; i++) - gl_rend_state.active_bind_texture_2d(i, rctx->empty_texture_2d); - gl_rend_state.active_bind_texture_cube_map(5, rctx->empty_texture_cube_map); - gl_rend_state.active_texture(0); - gl_rend_state.set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - uniform_value_reset(); - gl_rend_state.get(); - - for (ObjData*& i : obj[type]) { - switch (i->type) { - case OBJ_KIND_NORMAL: { - draw_sub_mesh_show_vector(rctx, &i->args.sub_mesh, - &i->mat, show_vector); - } break; - case OBJ_KIND_TRANSLUCENT: { - for (int32_t j = 0; j < i->args.translucent.count; j++) - draw_sub_mesh_show_vector(rctx, i->args.translucent.sub_mesh[j], - &i->mat, show_vector); - } break; - } - } - gl_rend_state.set_blend_func(GL_ONE, GL_ZERO); - }*/ - void DispManager::entry_list(ObjType type, ObjData* data) { obj[type].push_back(data); } @@ -3484,7 +3450,8 @@ namespace mdl { return wet_param; } - void DispManager::obj_sort(const mat4* view, ObjType type, int32_t compare_func, bool a3) { + void DispManager::obj_sort(render_data_context& rend_data_ctx, + ObjType type, int32_t compare_func, const cam_data& cam, bool a3) { std::list& list = obj[type]; if (list.size() < 1) return; @@ -3492,7 +3459,7 @@ namespace mdl { if (a3 && type == mdl::OBJ_TYPE_TRANSLUCENT) sub_140436760(); - calc_obj_radius(view, type); + calc_obj_radius(cam, type); switch (compare_func) { case 0: @@ -3513,12 +3480,13 @@ namespace mdl { } } - void DispManager::obj_sort(const mat4* view, ObjTypeLocal type, int32_t compare_func) { + void DispManager::obj_sort(render_data_context& rend_data_ctx, + ObjTypeLocal type, int32_t compare_func, const cam_data& cam) { std::list& list = obj[type]; if (list.size() < 1) return; - calc_obj_radius(view, type); + calc_obj_radius(cam, type); switch (compare_func) { case 0: @@ -3539,12 +3507,13 @@ namespace mdl { } } - void DispManager::obj_sort(const mat4* view, ObjTypeReflect type, int32_t compare_func) { + void DispManager::obj_sort(render_data_context& rend_data_ctx, + ObjTypeReflect type, int32_t compare_func, const cam_data& cam) { std::list& list = obj[type]; if (list.size() < 1) return; - calc_obj_radius(view, type); + calc_obj_radius(cam, type); switch (compare_func) { case 0: diff --git a/src/CRE/mdl/disp_manager.hpp b/src/CRE/mdl/disp_manager.hpp index bfc0611d..7f777174 100644 --- a/src/CRE/mdl/disp_manager.hpp +++ b/src/CRE/mdl/disp_manager.hpp @@ -63,6 +63,9 @@ struct texture_data_struct { texture_data_struct(); }; +struct cam_data; +struct render_data_context; + namespace mdl { struct ObjSubMeshArgs; @@ -317,7 +320,7 @@ namespace mdl { ~EtcObj(); }; - typedef void(*UserArgsFunc)(void* data, mat4* mat); + typedef void(*UserArgsFunc)(render_data_context& rend_data_ctx, void* data, const cam_data& cam, mat4* mat); struct UserArgs { UserArgsFunc func; @@ -458,16 +461,18 @@ namespace mdl { ObjData* alloc_obj_data(ObjKind kind); mat4* alloc_mat4_array(int32_t count); void buffer_reset(); - void calc_obj_radius(const mat4* view, ObjType type); - void calc_obj_radius(const mat4* view, ObjTypeLocal type); - void calc_obj_radius(const mat4* view, ObjTypeReflect type); + void calc_obj_radius(const cam_data& cam, ObjType type); + void calc_obj_radius(const cam_data& cam, ObjTypeLocal type); + void calc_obj_radius(const cam_data& cam, ObjTypeReflect type); void check_index_buffer(GLuint buffer); void check_vertex_arrays(); void check_vertex_buffer(GLuint buffer); - void draw(ObjType type, int32_t depth_mask = 0, bool reflect_texture_mask = true, int32_t alpha = -1); - void draw(ObjTypeLocal type, int32_t depth_mask = 0, bool reflect_texture_mask = true); - void draw(ObjTypeReflect type, int32_t depth_mask = 0, bool reflect_texture_mask = true); - /*void draw_show_vector(mdl::ObjType type, int32_t show_vector);*/ + void draw(render_data_context& rend_data_ctx, ObjType type, const cam_data& cam, + int32_t depth_mask = 0, bool reflect_texture_mask = true, int32_t alpha = -1); + void draw(render_data_context& rend_data_ctx, ObjTypeLocal type, const cam_data& cam, + int32_t depth_mask = 0, bool reflect_texture_mask = true); + void draw(render_data_context& rend_data_ctx, ObjTypeReflect type, const cam_data& cam, + int32_t depth_mask = 0, bool reflect_texture_mask = true); void entry_list(ObjType type, ObjData* data); void entry_list(ObjTypeLocal type, ObjData* data); void entry_list(ObjTypeReflect type, ObjData* data); @@ -521,9 +526,12 @@ namespace mdl { void get_texture_specular_offset(vec4& value); void get_texture_transform(int32_t& count, texture_transform_struct*& value); float_t get_wet_param(); - void obj_sort(const mat4* view, ObjType type, int32_t compare_func, bool a3 = false); - void obj_sort(const mat4* view, ObjTypeLocal type, int32_t compare_func); - void obj_sort(const mat4* view, ObjTypeReflect type, int32_t compare_func); + void obj_sort(render_data_context& rend_data_ctx, + ObjType type, int32_t compare_func, const cam_data& cam, bool a3 = false); + void obj_sort(render_data_context& rend_data_ctx, + ObjTypeLocal type, int32_t compare_func, const cam_data& cam); + void obj_sort(render_data_context& rend_data_ctx, + ObjTypeReflect type, int32_t compare_func, const cam_data& cam); void refresh(); void set_chara_color(bool value = false); void set_culling_func(bool(*func)(const obj_bounding_sphere*, const mat4*) = 0); diff --git a/src/CRE/mdl/draw_object.cpp b/src/CRE/mdl/draw_object.cpp index 39e4b9c3..2264359b 100644 --- a/src/CRE/mdl/draw_object.cpp +++ b/src/CRE/mdl/draw_object.cpp @@ -9,27 +9,35 @@ #include "../static_var.hpp" #include "../texture.hpp" -static bool draw_object_blend_set(render_context* rctx, +static bool draw_object_blend_set(render_data_context& rend_data_ctx, const mdl::ObjSubMeshArgs* args, obj_material_shader_lighting_type lighting_type); static bool draw_object_blend_set_check_use_default_blend(int32_t index); -static void draw_object_chara_color_fog_set(render_context* rctx, +static void draw_object_chara_color_fog_set(render_data_context& rend_data_ctx, const mdl::ObjSubMeshArgs* args, bool disable_fog); -static void draw_object_material_reset_default(const obj_material_data* mat_data); -static void draw_object_material_reset_reflect(render_context* rctx); -static void draw_object_material_set_default(render_context* rctx, +static void draw_object_material_reset_default( + render_data_context& rend_data_ctx, const obj_material_data* mat_data); +static void draw_object_material_reset_reflect(render_data_context& rend_data_ctx); +static void draw_object_material_set_default(render_data_context& rend_data_ctx, const mdl::ObjSubMeshArgs* args, bool use_shader); -static void draw_object_material_set_parameter(render_context* rctx, - const obj_material_data* mat_data); -static void draw_object_material_set_reflect(render_context* rctx, const mdl::ObjSubMeshArgs* args); -static void draw_object_material_set_uniform(const obj_material_data* mat_data, bool disable_color_l); -static void draw_object_model_mat_load(render_context* rctx, const mat4& mat); -static void draw_object_vertex_attrib_reset_default(const mdl::ObjSubMeshArgs* args); -static void draw_object_vertex_attrib_reset_reflect(const mdl::ObjSubMeshArgs* args); -static void draw_object_vertex_attrib_set_default(render_context* rctx, const mdl::ObjSubMeshArgs* args); -static void draw_object_vertex_attrib_set_reflect(render_context* rctx, const mdl::ObjSubMeshArgs* args); +static void draw_object_material_set_parameter( + render_data_context& rend_data_ctx, const obj_material_data* mat_data); +static void draw_object_material_set_reflect( + render_data_context& rend_data_ctx, const mdl::ObjSubMeshArgs* args); +static void draw_object_material_set_uniform(render_data_context& rend_data_ctx, + const obj_material_data* mat_data, bool disable_color_l); +static void draw_object_vertex_attrib_reset_default( + render_data_context& rend_data_ctx, const mdl::ObjSubMeshArgs* args); +static void draw_object_vertex_attrib_reset_reflect( + render_data_context& rend_data_ctx, const mdl::ObjSubMeshArgs* args); +static void draw_object_vertex_attrib_set_default( + render_data_context& rend_data_ctx, const mdl::ObjSubMeshArgs* args); +static void draw_object_vertex_attrib_set_reflect( + render_data_context& rend_data_ctx, const mdl::ObjSubMeshArgs* args); + +extern render_context* rctx_ptr; namespace mdl { - void draw(render_context* rctx, obj_primitive_type primitive_type, uint32_t count, + void draw(render_data_context& rend_data_ctx, obj_primitive_type primitive_type, uint32_t count, uint16_t start, uint16_t end, obj_index_format index_format, size_t indices) { GLenum mesh_draw_mode[] = { GL_ZERO, //GL_POINTS, @@ -50,23 +58,24 @@ namespace mdl { GL_UNSIGNED_INT, }; - rctx->set_render_data(); + rend_data_ctx.set_render_data_state(); if (primitive_type == OBJ_PRIMITIVE_TRIANGLE_STRIP && index_format == OBJ_INDEX_U16) - shaders_ft.draw_range_elements(GL_TRIANGLE_STRIP, + rend_data_ctx.state.draw_range_elements(GL_TRIANGLE_STRIP, start, end, count, GL_UNSIGNED_SHORT, (void*)indices); else - shaders_ft.draw_elements(mesh_draw_mode[primitive_type], + rend_data_ctx.state.draw_elements(mesh_draw_mode[primitive_type], count, mesh_indices_type[index_format], (void*)indices); - rctx->draw_state->stats.draw_count += count; + draw_state_stats& stats = rctx_ptr->draw_state->rend_data[rend_data_ctx.index].stats; + stats.draw_count += count; if (primitive_type == OBJ_PRIMITIVE_TRIANGLES) - rctx->draw_state->stats.draw_triangle_count += count / 3; + stats.draw_triangle_count += count / 3; else if (primitive_type == OBJ_PRIMITIVE_TRIANGLE_STRIP) - rctx->draw_state->stats.draw_triangle_count += count - 2; + stats.draw_triangle_count += count - 2; } - void draw_etc_obj(render_context* rctx, const mdl::EtcObj* etc, const mat4* mat) { + void draw_etc_obj(render_data_context& rend_data_ctx, const mdl::EtcObj* etc, const mat4* mat) { switch (etc->type) { case mdl::ETC_OBJ_TEAPOT: case mdl::ETC_OBJ_GRID: @@ -86,11 +95,11 @@ namespace mdl { if (!etc->count) return; - GLuint vao = rctx->disp_manager->get_vertex_array(etc); + GLuint vao = rctx_ptr->disp_manager->get_vertex_array(etc); if (!vao) return; - draw_object_model_mat_load(rctx, *mat); + rend_data_ctx.set_batch_worlds(*mat); const vec4 color = etc->color; @@ -101,159 +110,123 @@ namespace mdl { vec4 emission = etc->constant ? 1.0f : vec4(0.0f, 0.0f, 0.0f, 1.0f); vec4 specular = { 0.0f, 0.0f, 0.0f, 1.0f }; - rctx->set_batch_material_color(diffuse, ambient, emission, + rend_data_ctx.set_batch_material_color(diffuse, ambient, emission, 0.0f, specular, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f); - rctx->set_batch_blend_color_offset_color(1.0f, 0.0f); + rend_data_ctx.set_batch_blend_color_offset_color(1.0f, 0.0f); } else - rctx->set_batch_blend_color_offset_color(color, 0.0f); + rend_data_ctx.set_batch_blend_color_offset_color(color, 0.0f); - gl_rend_state.bind_vertex_array(vao); - //rctx->set_shader(SHADER_FT_SIMPLE); - rctx->set_shader(etc->constant ? SHADER_FT_CONSTANT : SHADER_FT_SIMPLE); - rctx->set_render_data(); + rend_data_ctx.state.bind_vertex_array(vao); + //rend_data_ctx.set_shader(SHADER_FT_SIMPLE); + rend_data_ctx.set_shader(etc->constant ? SHADER_FT_CONSTANT : SHADER_FT_SIMPLE); + rend_data_ctx.set_render_data_state(); switch (etc->type) { case mdl::ETC_OBJ_TEAPOT: - shaders_ft.draw_elements(GL_TRIANGLES, etc->count, GL_UNSIGNED_INT, 0); + rend_data_ctx.state.draw_elements(GL_TRIANGLES, etc->count, GL_UNSIGNED_INT, 0); break; case mdl::ETC_OBJ_GRID: - gl_rend_state.set_line_width(0.2f); - shaders_ft.draw_arrays(GL_LINES, 0, etc->count); - gl_rend_state.set_line_width(2.0f); - shaders_ft.draw_arrays(GL_LINES, (GLint)etc->count, 4); - gl_rend_state.set_line_width(1.0f); + rend_data_ctx.state.set_line_width(0.2f); + rend_data_ctx.state.draw_arrays(GL_LINES, 0, etc->count); + rend_data_ctx.state.set_line_width(2.0f); + rend_data_ctx.state.draw_arrays(GL_LINES, (GLint)etc->count, 4); + rend_data_ctx.state.set_line_width(1.0f); break; case mdl::ETC_OBJ_CUBE: if (etc->data.sphere.wire) - shaders_ft.draw_elements(GL_LINES, etc->count, GL_UNSIGNED_INT, (void*)etc->offset); + rend_data_ctx.state.draw_elements(GL_LINES, etc->count, GL_UNSIGNED_INT, (void*)etc->offset); else - shaders_ft.draw_elements(GL_TRIANGLES, etc->count, GL_UNSIGNED_INT, (void*)etc->offset); + rend_data_ctx.state.draw_elements(GL_TRIANGLES, etc->count, GL_UNSIGNED_INT, (void*)etc->offset); break; case mdl::ETC_OBJ_SPHERE: if (etc->data.sphere.wire) - shaders_ft.draw_elements(GL_LINES, etc->count, GL_UNSIGNED_INT, (void*)etc->offset); + rend_data_ctx.state.draw_elements(GL_LINES, etc->count, GL_UNSIGNED_INT, (void*)etc->offset); else - shaders_ft.draw_elements(GL_TRIANGLES, etc->count, GL_UNSIGNED_INT, (void*)etc->offset); + rend_data_ctx.state.draw_elements(GL_TRIANGLES, etc->count, GL_UNSIGNED_INT, (void*)etc->offset); break; case mdl::ETC_OBJ_PLANE: - shaders_ft.draw_arrays(GL_TRIANGLE_STRIP, 0, etc->count); + rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, etc->count); break; case mdl::ETC_OBJ_CONE: if (etc->data.cone.wire) - shaders_ft.draw_elements(GL_LINES, etc->count, GL_UNSIGNED_INT, (void*)etc->offset); + rend_data_ctx.state.draw_elements(GL_LINES, etc->count, GL_UNSIGNED_INT, (void*)etc->offset); else - shaders_ft.draw_elements(GL_TRIANGLES, etc->count, GL_UNSIGNED_INT, (void*)etc->offset); + rend_data_ctx.state.draw_elements(GL_TRIANGLES, etc->count, GL_UNSIGNED_INT, (void*)etc->offset); break; case mdl::ETC_OBJ_LINE: - shaders_ft.draw_arrays(GL_LINES, 0, etc->count); + rend_data_ctx.state.draw_arrays(GL_LINES, 0, etc->count); break; case mdl::ETC_OBJ_CROSS: - shaders_ft.draw_arrays(GL_LINES, 0, etc->count); + rend_data_ctx.state.draw_arrays(GL_LINES, 0, etc->count); break; case mdl::ETC_OBJ_CAPSULE: // Added if (etc->data.capsule.wire) - shaders_ft.draw_elements(GL_LINES, etc->count, GL_UNSIGNED_INT, (void*)etc->offset); + rend_data_ctx.state.draw_elements(GL_LINES, etc->count, GL_UNSIGNED_INT, (void*)etc->offset); else - shaders_ft.draw_elements(GL_TRIANGLES, etc->count, GL_UNSIGNED_INT, (void*)etc->offset); + rend_data_ctx.state.draw_elements(GL_TRIANGLES, etc->count, GL_UNSIGNED_INT, (void*)etc->offset); break; case mdl::ETC_OBJ_CYLINDER: // Added if (etc->data.cylinder.wire) - shaders_ft.draw_elements(GL_LINES, etc->count, GL_UNSIGNED_INT, (void*)etc->offset); + rend_data_ctx.state.draw_elements(GL_LINES, etc->count, GL_UNSIGNED_INT, (void*)etc->offset); else - shaders_ft.draw_elements(GL_TRIANGLES, etc->count, GL_UNSIGNED_INT, (void*)etc->offset); + rend_data_ctx.state.draw_elements(GL_TRIANGLES, etc->count, GL_UNSIGNED_INT, (void*)etc->offset); break; } - shader::unbind(); - uniform_value_reset(); + shader::unbind(rend_data_ctx.state); + rend_data_ctx.reset_shader_flags(); - rctx->set_batch_blend_color_offset_color(1.0f, 0.0f); + rend_data_ctx.set_batch_blend_color_offset_color(1.0f, 0.0f); } - void draw_sub_mesh(render_context* rctx, const ObjSubMeshArgs* args, const mat4* mat, - void(*func)(render_context* rctx, const ObjSubMeshArgs* args)) { - GLuint vao = rctx->disp_manager->get_vertex_array(args); + void draw_sub_mesh(render_data_context& rend_data_ctx, const ObjSubMeshArgs* args, + const mat4* mat, void(*func)(render_data_context& rend_data_ctx, + const ObjSubMeshArgs* args, const cam_data& cam, const mat4* mat), const cam_data& cam) { + GLuint vao = rctx_ptr->disp_manager->get_vertex_array(args); if (!vao) return; if (args->mats) { - const mat4* mats = args->mats; + rend_data_ctx.set_skinning_data(rend_data_ctx.state, args->mats, args->mat_count); - if (args->mat_count == 2) - rctx->set_batch_joint(mats[0]); - - if (sv_shared_storage_uniform_buffer) { - GLuint buffer = 0; - size_t offset = 0; - size_t size = 0; - if (rctx->get_shared_storage_uniform_buffer_data( - (size_t)args->mats, buffer, offset, size, !!GLAD_GL_VERSION_4_3)) - if (GLAD_GL_VERSION_4_3) - gl_rend_state.bind_shader_storage_buffer_range(0, buffer, (GLintptr)offset, (GLsizeiptr)size); - else - gl_rend_state.bind_uniform_buffer_range(6, buffer, (GLintptr)offset, (GLsizeiptr)size); - } - else { - vec4* g_joint_transforms = rctx->data.buffer_skinning_data.g_joint_transforms; - - mat4 mat; - for (int32_t i = 0; i < args->mat_count; i++, mats++, g_joint_transforms += 3) { - mat4_transpose(mats, &mat); - g_joint_transforms[0] = mat.row0; - g_joint_transforms[1] = mat.row1; - g_joint_transforms[2] = mat.row2; - } - - if (GLAD_GL_VERSION_4_3) - rctx->data.buffer_skinning.WriteMemory(rctx->data.buffer_skinning_data); - else - rctx->data.buffer_skinning_ubo.WriteMemory(0, - sizeof(vec4) * 3 * args->mat_count, &rctx->data.buffer_skinning_data); - } - - rctx->set_batch_worlds(mat4_identity); - - uniform_value[U_SKINNING] = 1; - gl_rend_state.bind_vertex_array(vao); - func(rctx, args); - uniform_value[U_SKINNING] = 0; + rend_data_ctx.shader_flags.arr[U_SKINNING] = 1; + rend_data_ctx.state.bind_vertex_array(vao); + rend_data_ctx.set_batch_worlds(*mat); + func(rend_data_ctx, args, cam, mat); + rend_data_ctx.shader_flags.arr[U_SKINNING] = 0; } else { mat4 _mat; if (args->mesh->attrib.m.billboard) - model_mat_face_camera_view(&rctx->view_mat, mat, &_mat); + model_mat_face_camera_view(cam, mat, &_mat); else if (args->mesh->attrib.m.billboard_y_axis) - model_mat_face_camera_position(&rctx->view_mat, mat, &_mat); + model_mat_face_camera_position(cam, mat, &_mat); else _mat = *mat; - uniform_value[U_SKINNING] = 0; - gl_rend_state.bind_vertex_array(vao); + rend_data_ctx.shader_flags.arr[U_SKINNING] = 0; + rend_data_ctx.state.bind_vertex_array(vao); if (func != draw_sub_mesh_default || !args->instances_count) { - draw_object_model_mat_load(rctx, _mat); - func(rctx, args); + rend_data_ctx.set_batch_worlds(_mat); + func(rend_data_ctx, args, cam, mat); } else - draw_sub_mesh_default_instanced(rctx, args, &_mat); - uniform_value[U_SKINNING] = 0; + draw_sub_mesh_default_instanced(rend_data_ctx, args, cam, &_mat); + rend_data_ctx.shader_flags.arr[U_SKINNING] = 0; } } - /*void draw_sub_mesh_show_vector(render_context* rctx, - const ObjSubMeshArgs* args, mat4* model, int32_t show_vector) { - return; - }*/ - - void draw_sub_mesh_default(render_context* rctx, const ObjSubMeshArgs* args) { + void draw_sub_mesh_default(render_data_context& rend_data_ctx, + const ObjSubMeshArgs* args, const cam_data& cam, const mat4* mat) { if (args->set_blend_color) - rctx->set_batch_blend_color_offset_color(args->blend_color, 0.0f); + rend_data_ctx.set_batch_blend_color_offset_color(args->blend_color, 0.0f); if (!args->func) - draw_object_vertex_attrib_set_default(rctx, args); + draw_object_vertex_attrib_set_default(rend_data_ctx, args); - draw_object_material_set_default(rctx, args, rctx->draw_state->shader); + draw_object_material_set_default(rend_data_ctx, args, rctx_ptr->draw_state->shader); const obj_sub_mesh* sub_mesh = args->sub_mesh; - draw(rctx, + draw(rend_data_ctx, sub_mesh->primitive_type, sub_mesh->num_index, sub_mesh->first_index, @@ -261,33 +234,33 @@ namespace mdl { sub_mesh->index_format, sub_mesh->index_offset); - draw_object_material_reset_default(args->material); + draw_object_material_reset_default(rend_data_ctx, args->material); if (!args->func) - draw_object_vertex_attrib_reset_default(args); + draw_object_vertex_attrib_reset_default(rend_data_ctx, args); if (args->set_blend_color) - rctx->set_batch_blend_color_offset_color(1.0f, 0.0f); + rend_data_ctx.set_batch_blend_color_offset_color(1.0f, 0.0f); - rctx->draw_state->stats.object_draw_count++; + rctx_ptr->draw_state->rend_data[rend_data_ctx.index].stats.object_draw_count++; } - void draw_sub_mesh_default_instanced(render_context* rctx, - const ObjSubMeshArgs* args, const mat4* mat) { + void draw_sub_mesh_default_instanced(render_data_context& rend_data_ctx, + const ObjSubMeshArgs* args, const cam_data& cam, const mat4* mat) { if (args->set_blend_color) - rctx->set_batch_blend_color_offset_color(args->blend_color, 0.0f); + rend_data_ctx.set_batch_blend_color_offset_color(args->blend_color, 0.0f); if (!args->func) - draw_object_vertex_attrib_set_default(rctx, args); + draw_object_vertex_attrib_set_default(rend_data_ctx, args); - draw_object_material_set_default(rctx, args, rctx->draw_state->shader); + draw_object_material_set_default(rend_data_ctx, args, rctx_ptr->draw_state->shader); const obj_sub_mesh* sub_mesh = args->sub_mesh; const mat4* instances_mat = args->instances_mat; mat4 _mat; for (int32_t i = args->instances_count; i >= 0; i--, instances_mat++) { mat4_mul(instances_mat, mat, &_mat); - draw_object_model_mat_load(rctx, _mat); - draw(rctx, + rend_data_ctx.set_batch_worlds(_mat); + draw(rend_data_ctx, sub_mesh->primitive_type, sub_mesh->num_index, sub_mesh->first_index, @@ -296,38 +269,39 @@ namespace mdl { sub_mesh->index_offset); } - draw_object_material_reset_default(args->material); + draw_object_material_reset_default(rend_data_ctx, args->material); if (!args->func) - draw_object_vertex_attrib_reset_default(args); + draw_object_vertex_attrib_reset_default(rend_data_ctx, args); if (args->set_blend_color) - rctx->set_batch_blend_color_offset_color(1.0f, 0.0f); + rend_data_ctx.set_batch_blend_color_offset_color(1.0f, 0.0f); - rctx->draw_state->stats.object_draw_count++; + rctx_ptr->draw_state->rend_data[rend_data_ctx.index].stats.object_draw_count++; } - void draw_sub_mesh_sss(render_context* rctx, const ObjSubMeshArgs* args) { + void draw_sub_mesh_sss(render_data_context& rend_data_ctx, + const ObjSubMeshArgs* args, const cam_data& cam, const mat4* mat) { obj_material_attrib_member attrib = args->material->material.attrib.m; - uniform_value[U_ALPHA_TEST] = (!attrib.flag_28 && (args->blend_color.w < 1.0f + rend_data_ctx.shader_flags.arr[U_ALPHA_TEST] = (!attrib.flag_28 && (args->blend_color.w < 1.0f || (attrib.alpha_texture || attrib.alpha_material) && !attrib.punch_through || args->sub_mesh->attrib.m.translucent) || attrib.punch_through) ? 1 : 0; - uniform_value[U_NPR_NORMAL] = 1; + rend_data_ctx.shader_flags.arr[U_NPR_NORMAL] = 1; bool chara = false; const obj_material_data* material = args->material; switch (material->material.shader.index) { case SHADER_FT_CLOTH: - if (!rctx->render_manager->npr_param && material->material.color.ambient.w < 1.0f + if (!rctx_ptr->render_manager->npr_param && material->material.color.ambient.w < 1.0f && material->material.shader_info.m.aniso_direction == OBJ_MATERIAL_ANISO_DIRECTION_NORMAL) chara = true; break; case SHADER_FT_TIGHTS: - if (!rctx->render_manager->npr_param) + if (!rctx_ptr->render_manager->npr_param) chara = true; break; case SHADER_FT_GLASEYE: - uniform_value[U_NPR_NORMAL] = 0; + rend_data_ctx.shader_flags.arr[U_NPR_NORMAL] = 0; chara = true; break; case SHADER_FT_SKIN: @@ -336,29 +310,30 @@ namespace mdl { } if (chara) { - rctx->set_batch_sss_param({ 0.0f, 0.0f, 0.0f, 0.5f }); - uniform_value[U_SSS_CHARA] = 1; + rend_data_ctx.set_batch_sss_param({ 0.0f, 0.0f, 0.0f, 0.5f }); + rend_data_ctx.shader_flags.arr[U_SSS_CHARA] = 1; } else { - const vec4& sss_param = rctx->sss_data->param; - rctx->set_batch_sss_param({ sss_param.x, sss_param.y, sss_param.z, 0.5f }); - uniform_value[U_SSS_CHARA] = 0; + const vec4& sss_param = rctx_ptr->sss_data->param; + rend_data_ctx.set_batch_sss_param({ sss_param.x, sss_param.y, sss_param.z, 0.5f }); + rend_data_ctx.shader_flags.arr[U_SSS_CHARA] = 0; } - draw_sub_mesh_default(rctx, args); + draw_sub_mesh_default(rend_data_ctx, args, cam, mat); } - void draw_sub_mesh_reflect(render_context* rctx, const ObjSubMeshArgs* args) { + void draw_sub_mesh_reflect(render_data_context& rend_data_ctx, + const ObjSubMeshArgs* args, const cam_data& cam, const mat4* mat) { const obj_material_data* material = args->material; - draw_object_vertex_attrib_set_reflect(rctx, args); + draw_object_vertex_attrib_set_reflect(rend_data_ctx, args); obj_material_shader_lighting_type lighting_type = material->material.shader_info.get_lighting_type(); - bool disable_fog = draw_object_blend_set(rctx, args, lighting_type); - draw_object_chara_color_fog_set(rctx, args, disable_fog); - draw_object_material_set_reflect(rctx, args); + bool disable_fog = draw_object_blend_set(rend_data_ctx, args, lighting_type); + draw_object_chara_color_fog_set(rend_data_ctx, args, disable_fog); + draw_object_material_set_reflect(rend_data_ctx, args); const obj_sub_mesh* sub_mesh = args->sub_mesh; if (sub_mesh->index_format != OBJ_INDEX_U8) - draw(rctx, + draw(rend_data_ctx, sub_mesh->primitive_type, sub_mesh->num_index, sub_mesh->first_index, @@ -366,20 +341,21 @@ namespace mdl { sub_mesh->index_format, sub_mesh->index_offset); - draw_object_material_reset_reflect(rctx); - draw_object_vertex_attrib_reset_reflect(args); - uniform_value_reset(); + draw_object_material_reset_reflect(rend_data_ctx); + draw_object_vertex_attrib_reset_reflect(rend_data_ctx, args); + rend_data_ctx.reset_shader_flags(); - rctx->draw_state->stats.object_reflect_draw_count++; + rctx_ptr->draw_state->rend_data[rend_data_ctx.index].stats.object_reflect_draw_count++; } - void draw_sub_mesh_reflect_reflect_map(render_context* rctx, const ObjSubMeshArgs* args) { - draw_object_vertex_attrib_set_reflect(rctx, args); - draw_object_material_set_reflect(rctx, args); + void draw_sub_mesh_reflect_reflect_map(render_data_context& rend_data_ctx, + const ObjSubMeshArgs* args, const cam_data& cam, const mat4* mat) { + draw_object_vertex_attrib_set_reflect(rend_data_ctx, args); + draw_object_material_set_reflect(rend_data_ctx, args); const obj_sub_mesh* sub_mesh = args->sub_mesh; if (sub_mesh->index_format != OBJ_INDEX_U8) - draw(rctx, + draw(rend_data_ctx, sub_mesh->primitive_type, sub_mesh->num_index, sub_mesh->first_index, @@ -387,42 +363,44 @@ namespace mdl { sub_mesh->index_format, sub_mesh->index_offset); - draw_object_material_reset_reflect(rctx); - draw_object_vertex_attrib_reset_reflect(args); + draw_object_material_reset_reflect(rend_data_ctx); + draw_object_vertex_attrib_reset_reflect(rend_data_ctx, args); - rctx->draw_state->stats.object_reflect_draw_count++; + rctx_ptr->draw_state->rend_data[rend_data_ctx.index].stats.object_reflect_draw_count++; } - void draw_sub_mesh_shadow(render_context* rctx, const ObjSubMeshArgs* args) { + void draw_sub_mesh_shadow(render_data_context& rend_data_ctx, + const ObjSubMeshArgs* args, const cam_data& cam, const mat4* mat) { obj_material_attrib_member attrib = args->material->material.attrib.m; if (!attrib.flag_28 && (args->blend_color.w < 1.0f || (attrib.alpha_texture || attrib.alpha_material) && !attrib.punch_through || args->sub_mesh->attrib.m.translucent) || attrib.punch_through) { - uniform_value[U_ALPHA_TEST] = 1; - rctx->set_batch_alpha_threshold(0.5f); - draw_sub_mesh_translucent(rctx, args); - uniform_value[U_ALPHA_TEST] = 0; - rctx->set_batch_alpha_threshold(0.0f); + rend_data_ctx.shader_flags.arr[U_ALPHA_TEST] = 1; + rend_data_ctx.set_batch_alpha_threshold(0.5f); + draw_sub_mesh_translucent(rend_data_ctx, args, cam, mat); + rend_data_ctx.shader_flags.arr[U_ALPHA_TEST] = 0; + rend_data_ctx.set_batch_alpha_threshold(0.0f); } else - draw_sub_mesh_translucent(rctx, args); + draw_sub_mesh_translucent(rend_data_ctx, args, cam, mat); } - void draw_sub_mesh_translucent(render_context* rctx, const ObjSubMeshArgs* args) { + void draw_sub_mesh_translucent(render_data_context& rend_data_ctx, + const ObjSubMeshArgs* args, const cam_data& cam, const mat4* mat) { const obj_material_data* material = args->material; const std::vector* textures = args->textures; - if (rctx->draw_state->shader_index != -1) { - rctx->set_batch_material_color_emission(args->emission); - draw_object_material_set_uniform(material, false); + if (rctx_ptr->draw_state->rend_data[rend_data_ctx.index].shader_index != -1) { + rend_data_ctx.set_batch_material_color_emission(args->emission); + draw_object_material_set_uniform(rend_data_ctx, material, false); if (material->material.attrib.m.alpha_texture) - uniform_value[U_TEXTURE_COUNT] = 0; - rctx->set_shader(rctx->draw_state->shader_index); + rend_data_ctx.shader_flags.arr[U_TEXTURE_COUNT] = 0; + rend_data_ctx.set_shader(rctx_ptr->draw_state->rend_data[rend_data_ctx.index].shader_index); } - draw_object_vertex_attrib_set_default(rctx, args); + draw_object_vertex_attrib_set_default(rend_data_ctx, args); if (args->material->material.attrib.m.double_sided) - gl_rend_state.disable_cull_face(); + rend_data_ctx.state.disable_cull_face(); GLuint tex_id = -1; int32_t tex_index = 0; @@ -461,9 +439,9 @@ namespace mdl { tex_id = (*textures)[texdata->texture_index]; if (tex_id == -1) - tex_id = rctx->empty_texture_2d->glid; + tex_id = rctx_ptr->empty_texture_2d->glid; - gl_rend_state.active_bind_texture_2d(tex_index, tex_id); + rend_data_ctx.state.active_bind_texture_2d(tex_index, tex_id); int32_t wrap_s; if (texdata->attrib.m.mirror_u) @@ -482,14 +460,14 @@ namespace mdl { wrap_t = 0; texture* tex = texture_manager_get_texture(::texture_id(0x00, texture_id)); - gl_rend_state.bind_sampler(tex_index, rctx->samplers[(wrap_t * 3 + wrap_s) * 2 + rend_data_ctx.state.bind_sampler(tex_index, rctx_ptr->samplers[(wrap_t * 3 + wrap_s) * 2 + (!tex || tex->max_mipmap_level > 0 ? 1 : 0)]); } } const obj_sub_mesh* sub_mesh = args->sub_mesh; if (sub_mesh->index_format != OBJ_INDEX_U8) - draw(rctx, + draw(rend_data_ctx, sub_mesh->primitive_type, sub_mesh->num_index, sub_mesh->first_index, @@ -498,21 +476,21 @@ namespace mdl { sub_mesh->index_offset); if (tex_id != -1) - gl_rend_state.active_bind_texture_2d(tex_index, rctx->empty_texture_2d->glid); + rend_data_ctx.state.active_bind_texture_2d(tex_index, rctx_ptr->empty_texture_2d->glid); - gl_rend_state.enable_cull_face(); - draw_object_vertex_attrib_reset_default(args); + rend_data_ctx.state.enable_cull_face(); + draw_object_vertex_attrib_reset_default(rend_data_ctx, args); - if (rctx->draw_state->shader_index != -1) - uniform_value_reset(); + if (rctx_ptr->draw_state->rend_data[rend_data_ctx.index].shader_index != -1) + rend_data_ctx.reset_shader_flags(); - rctx->draw_state->stats.object_translucent_draw_count++; + rctx_ptr->draw_state->rend_data[rend_data_ctx.index].stats.object_translucent_draw_count++; } } -inline void model_mat_face_camera_position(const mat4* view, const mat4* src, mat4* dst) { +inline void model_mat_face_camera_position(const cam_data& cam, const mat4* src, mat4* dst) { mat4 mat; - mat4_invert_fast(view, &mat); + mat4_invert_fast(&cam.get_view_mat(), &mat); vec3 dir = vec3::normalize(*(vec3*)&mat.row3 - *(vec3*)&src->row3); @@ -534,15 +512,15 @@ inline void model_mat_face_camera_position(const mat4* view, const mat4* src, ma dst->row3.w = 1.0f; } -inline void model_mat_face_camera_view(const mat4* view, const mat4* src, mat4* dst) { +inline void model_mat_face_camera_view(const cam_data& cam, const mat4* src, mat4* dst) { mat3 mat; - mat4_to_mat3(view, &mat); + mat4_to_mat3(&cam.get_view_mat(), &mat); mat3_invert(&mat, &mat); mat4_from_mat3(&mat, dst); mat4_mul(dst, src, dst); } -static bool draw_object_blend_set(render_context* rctx, +static bool draw_object_blend_set(render_data_context& rend_data_ctx, const mdl::ObjSubMeshArgs* args, obj_material_shader_lighting_type lighting_type) { static const GLenum blend_factor_table[] = { GL_ZERO, @@ -571,13 +549,13 @@ static bool draw_object_blend_set(render_context* rctx, GLenum src_blend_factor = blend_factor_table[attrib.src_blend_factor]; GLenum dst_blend_factor = blend_factor_table[attrib.dst_blend_factor]; if (args->chara_color) { - light_set* set = &rctx->light_set[LIGHT_SET_MAIN]; + light_set* set = &rctx_ptr->light_set[LIGHT_SET_MAIN]; light_data* chara_color = &set->lights[LIGHT_CHARA_COLOR]; vec4 specular; chara_color->get_specular(specular); if (specular.w >= 4.0f && chara_color->get_type() == LIGHT_PARALLEL && (src_blend_factor != GL_ONE || dst_blend_factor)) { - int32_t shader_index = rctx->draw_state->shader_index; + int32_t shader_index = rctx_ptr->draw_state->rend_data[rend_data_ctx.index].shader_index; if (shader_index == -1) { shader_index = material->material.shader.index; if (shader_index == SHADER_FT_BLINN) { @@ -594,7 +572,7 @@ static bool draw_object_blend_set(render_context* rctx, } } } - gl_rend_state.set_blend_func(src_blend_factor, dst_blend_factor); + rend_data_ctx.state.set_blend_func(src_blend_factor, dst_blend_factor); return dst_blend_factor == GL_ONE; } @@ -612,58 +590,61 @@ static bool draw_object_blend_set_check_use_default_blend(int32_t index) { return false; } -static void draw_object_chara_color_fog_set(render_context* rctx, const mdl::ObjSubMeshArgs* args, bool disable_fog) { - uniform_value[U_CHARA_COLOR] = 0; +static void draw_object_chara_color_fog_set(render_data_context& rend_data_ctx, + const mdl::ObjSubMeshArgs* args, bool disable_fog) { + rend_data_ctx.shader_flags.arr[U_CHARA_COLOR] = 0; if (args->chara_color) { - light_set* set = &rctx->light_set[LIGHT_SET_MAIN]; + light_set* set = &rctx_ptr->light_set[LIGHT_SET_MAIN]; light_data* chara_color = &set->lights[LIGHT_CHARA_COLOR]; vec4 specular; chara_color->get_specular(specular); if (specular.w > 0.0f && chara_color->get_type() == LIGHT_PARALLEL) - uniform_value[U_CHARA_COLOR] = 1; + rend_data_ctx.shader_flags.arr[U_CHARA_COLOR] = 1; } obj_material_attrib_member attrib = args->material->material.attrib.m; if (!attrib.no_fog && !disable_fog) { - uniform_value[U_FOG_STAGE] = attrib.has_fog_height ? (attrib.fog_height ? 3 : 2) : 1; - uniform_value[U_FOG_CHARA] = rctx->draw_state->fog_height ? 2 : 1; + rend_data_ctx.shader_flags.arr[U_FOG_STAGE] = attrib.has_fog_height ? (attrib.fog_height ? 3 : 2) : 1; + rend_data_ctx.shader_flags.arr[U_FOG_CHARA] = rctx_ptr->draw_state->fog_height ? 2 : 1; } } -static void draw_object_material_reset_default(const obj_material_data* mat_data) { +static void draw_object_material_reset_default( + render_data_context& rend_data_ctx, const obj_material_data* mat_data) { if (mat_data) { - gl_rend_state.enable_cull_face(); + rend_data_ctx.state.enable_cull_face(); obj_material_attrib_member attrib = mat_data->material.attrib.m; if ((attrib.alpha_texture || attrib.alpha_material) && !attrib.punch_through) - gl_rend_state.set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + rend_data_ctx.state.set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } - uniform_value_reset(); + rend_data_ctx.reset_shader_flags(); } -static void draw_object_material_reset_reflect(render_context* rctx) { - gl_rend_state.active_bind_texture_2d(0, rctx->empty_texture_2d->glid); - gl_rend_state.enable_cull_face(); - uniform_value_reset(); +static void draw_object_material_reset_reflect(render_data_context& rend_data_ctx) { + rend_data_ctx.state.active_bind_texture_2d(0, rctx_ptr->empty_texture_2d->glid); + rend_data_ctx.state.enable_cull_face(); + rend_data_ctx.reset_shader_flags(); } -static void draw_object_material_set_default(render_context* rctx, const mdl::ObjSubMeshArgs* args, bool use_shader) { +static void draw_object_material_set_default(render_data_context& rend_data_ctx, + const mdl::ObjSubMeshArgs* args, bool use_shader) { const std::vector* textures = args->textures; const obj_material_data* material = args->material; obj_material_shader_lighting_type lighting_type = material->material.shader_info.get_lighting_type(); - bool disable_fog = draw_object_blend_set(rctx, args, lighting_type); - draw_object_material_set_uniform(material, false); - if (!rctx->draw_state->shadow) - uniform_value[U_STAGE_SHADOW] = 0; + bool disable_fog = draw_object_blend_set(rend_data_ctx, args, lighting_type); + draw_object_material_set_uniform(rend_data_ctx, material, false); + if (!rctx_ptr->draw_state->rend_data[rend_data_ctx.index].shadow) + rend_data_ctx.shader_flags.arr[U_STAGE_SHADOW] = 0; else if (!args->self_shadow) - uniform_value[U_STAGE_SHADOW] = args->sub_mesh->attrib.m.recieve_shadow ? 1 : 0; + rend_data_ctx.shader_flags.arr[U_STAGE_SHADOW] = args->sub_mesh->attrib.m.recieve_shadow ? 1 : 0; else if (args->self_shadow != 1) - uniform_value[U_STAGE_SHADOW] = 0; + rend_data_ctx.shader_flags.arr[U_STAGE_SHADOW] = 0; else - uniform_value[U_STAGE_SHADOW] = 1; + rend_data_ctx.shader_flags.arr[U_STAGE_SHADOW] = 1; - uniform_value[U_CHARA_SHADOW2] = args->shadow > SHADOW_CHARA ? 1 : 0; - uniform_value[U_CHARA_SHADOW] = rctx->draw_state->self_shadow ? 1 : 0; + rend_data_ctx.shader_flags.arr[U_CHARA_SHADOW2] = args->shadow > SHADOW_CHARA ? 1 : 0; + rend_data_ctx.shader_flags.arr[U_CHARA_SHADOW] = rctx_ptr->draw_state->rend_data[rend_data_ctx.index].self_shadow ? 1 : 0; const obj_material_texture_data* texdata = material->material.texdata; for (int32_t i = 0, j = 0; i < 8; i++, texdata++) { @@ -697,27 +678,27 @@ static void draw_object_material_set_default(render_context* rctx, const mdl::Ob if (texdata->attrib.m.flag_29) { switch (tex_type) { case OBJ_MATERIAL_TEXTURE_NORMAL: - uniform_value[U_NORMAL] = 0; + rend_data_ctx.shader_flags.arr[U_NORMAL] = 0; break; case OBJ_MATERIAL_TEXTURE_SPECULAR: - uniform_value[U_SPECULAR] = 0; + rend_data_ctx.shader_flags.arr[U_SPECULAR] = 0; break; case OBJ_MATERIAL_TEXTURE_TRANSLUCENCY: - uniform_value[U_TRANSLUCENCY] = 0; + rend_data_ctx.shader_flags.arr[U_TRANSLUCENCY] = 0; break; case OBJ_MATERIAL_TEXTURE_TRANSPARENCY: - uniform_value[U_TRANSPARENCY] = 0; + rend_data_ctx.shader_flags.arr[U_TRANSPARENCY] = 0; break; } continue; } if (tex_type == OBJ_MATERIAL_TEXTURE_ENVIRONMENT_CUBE) { - gl_rend_state.active_bind_texture_cube_map(tex_index, tex_id); - gl_rend_state.bind_sampler(tex_index, 0); + rend_data_ctx.state.active_bind_texture_cube_map(tex_index, tex_id); + rend_data_ctx.state.bind_sampler(tex_index, 0); } else { - gl_rend_state.active_bind_texture_2d(tex_index, tex_id); + rend_data_ctx.state.active_bind_texture_2d(tex_index, tex_id); int32_t wrap_s; if (texdata->attrib.m.mirror_u) @@ -736,7 +717,7 @@ static void draw_object_material_set_default(render_context* rctx, const mdl::Ob wrap_t = 0; texture* tex = texture_manager_get_texture(texture_id); - gl_rend_state.bind_sampler(tex_index, rctx->samplers[(wrap_t * 3 + wrap_s) * 2 + rend_data_ctx.state.bind_sampler(tex_index, rctx_ptr->samplers[(wrap_t * 3 + wrap_s) * 2 + (!tex || tex->max_mipmap_level > 0 ? 1 : 0)]); } @@ -747,29 +728,29 @@ static void draw_object_material_set_default(render_context* rctx, const mdl::Ob texture* tex = texture_manager_get_texture(texdata->tex_index); if (!tex) - uniform_value[uni_type] = 1; + rend_data_ctx.shader_flags.arr[uni_type] = 1; else if (tex->internal_format == GL_COMPRESSED_RED_RGTC1_EXT) - uniform_value[uni_type] = 3; + rend_data_ctx.shader_flags.arr[uni_type] = 3; else if (tex->internal_format == GL_COMPRESSED_RED_GREEN_RGTC2_EXT) - uniform_value[uni_type] = 2; + rend_data_ctx.shader_flags.arr[uni_type] = 2; else - uniform_value[uni_type] = 1; + rend_data_ctx.shader_flags.arr[uni_type] = 1; } if (tex_index >= 0 && tex_index <= 1) - uniform_value[U_TEXTURE_BLEND] = texdata->attrib.get_blend(); + rend_data_ctx.shader_flags.arr[U_TEXTURE_BLEND] = texdata->attrib.get_blend(); } if (material->material.attrib.m.double_sided) { - gl_rend_state.disable_cull_face(); + rend_data_ctx.state.disable_cull_face(); if (!material->material.attrib.m.normal_dir_light) - uniform_value[U0B] = 1; + rend_data_ctx.shader_flags.arr[U0B] = 1; } - draw_object_chara_color_fog_set(rctx, args, disable_fog); + draw_object_chara_color_fog_set(rend_data_ctx, args, disable_fog); vec4 ambient = material->material.color.ambient; - if (!rctx->sss_data->enable) + if (!rctx_ptr->sss_data->enable) ambient.w = 1.0f; vec4 diffuse = material->material.color.diffuse; vec4 emission = args->emission; @@ -781,12 +762,12 @@ static void draw_object_material_set_default(render_context* rctx, const mdl::Ob float_t luma = vec3::dot(*(vec3*)&specular, { 0.30f, 0.59f, 0.11f }); if (luma >= 0.01f || args->texture_color_coefficients.w >= 0.1f) - uniform_value[U_SPECULAR_IBL] = 1; + rend_data_ctx.shader_flags.arr[U_SPECULAR_IBL] = 1; else - uniform_value[U_SPECULAR_IBL] = 0; + rend_data_ctx.shader_flags.arr[U_SPECULAR_IBL] = 0; if (!material->material.shader_info.m.fresnel_type) - uniform_value[U_TRANSLUCENCY] = 0; + rend_data_ctx.shader_flags.arr[U_TRANSLUCENCY] = 0; line_light = (float_t)material->material.shader_info.m.line_light * (float_t)(1.0 / 9.0); } @@ -812,7 +793,7 @@ static void draw_object_material_set_default(render_context* rctx, const mdl::Ob if (fresnel > 9.0f) fresnel = 9.0f; else if (fresnel == 0.0f) - fresnel = rctx->draw_state->fresnel; + fresnel = rctx_ptr->draw_state->fresnel; fresnel = (fresnel - 1.0f) * 0.12f * 0.82f; fresnel_coefficients = { fresnel, 0.18f, line_light, 0.0f }; @@ -839,31 +820,32 @@ static void draw_object_material_set_default(render_context* rctx, const mdl::Ob } } - rctx->set_batch_material_color(diffuse, ambient, emission, material_shininess, + rend_data_ctx.set_batch_material_color(diffuse, ambient, emission, material_shininess, specular, fresnel_coefficients, texture_color_coefficients, texture_color_offset, texture_specular_coefficients, texture_specular_offset, shininess); if (!use_shader) - rctx->set_shader(SHADER_FT_SIMPLE); - else if (rctx->draw_state->shader_index != -1) - rctx->set_shader(rctx->draw_state->shader_index); + rend_data_ctx.set_shader(SHADER_FT_SIMPLE); + else if (rctx_ptr->draw_state->rend_data[rend_data_ctx.index].shader_index != -1) + rend_data_ctx.set_shader(rctx_ptr->draw_state->rend_data[rend_data_ctx.index].shader_index); else if (material->material.shader.index != -1) { if (material->material.shader.index != SHADER_FT_BLINN) - rctx->set_shader(material->material.shader.index); + rend_data_ctx.set_shader(material->material.shader.index); else if (lighting_type == OBJ_MATERIAL_SHADER_LIGHTING_LAMBERT) - rctx->set_shader(SHADER_FT_LAMBERT); + rend_data_ctx.set_shader(SHADER_FT_LAMBERT); else if (lighting_type == OBJ_MATERIAL_SHADER_LIGHTING_PHONG) - rctx->set_shader(SHADER_FT_BLINN); + rend_data_ctx.set_shader(SHADER_FT_BLINN); else - rctx->set_shader(SHADER_FT_CONSTANT); + rend_data_ctx.set_shader(SHADER_FT_CONSTANT); } else - rctx->set_shader(SHADER_FT_CONSTANT); + rend_data_ctx.set_shader(SHADER_FT_CONSTANT); - draw_object_material_set_parameter(rctx, material); + draw_object_material_set_parameter(rend_data_ctx, material); } -static void draw_object_material_set_parameter(render_context* rctx, const obj_material_data* mat_data) { +static void draw_object_material_set_parameter( + render_data_context& rend_data_ctx, const obj_material_data* mat_data) { vec4 specular; float_t bump_depth; float_t intensity; @@ -871,15 +853,15 @@ static void draw_object_material_set_parameter(render_context* rctx, const obj_m float_t refract_uv_scale; float_t inv_bump_depth; bool has_specular; - if (rctx->draw_state->use_global_material) { - bump_depth = rctx->draw_state->global_material.bump_depth; - intensity = rctx->draw_state->global_material.intensity; - reflect_uv_scale = rctx->draw_state->global_material.reflect_uv_scale; - refract_uv_scale = rctx->draw_state->global_material.refract_uv_scale; - inv_bump_depth = (1.0f - rctx->draw_state->global_material.bump_depth) * 64.0f + 1.0f; + if (rctx_ptr->draw_state->use_global_material) { + bump_depth = rctx_ptr->draw_state->global_material.bump_depth; + intensity = rctx_ptr->draw_state->global_material.intensity; + reflect_uv_scale = rctx_ptr->draw_state->global_material.reflect_uv_scale; + refract_uv_scale = rctx_ptr->draw_state->global_material.refract_uv_scale; + inv_bump_depth = (1.0f - rctx_ptr->draw_state->global_material.bump_depth) * 64.0f + 1.0f; specular = mat_data->material.color.specular; - specular.w = rctx->draw_state->global_material.reflectivity; + specular.w = rctx_ptr->draw_state->global_material.reflectivity; has_specular = true; } else { @@ -891,17 +873,18 @@ static void draw_object_material_set_parameter(render_context* rctx, const obj_m has_specular = false; } - rctx->set_batch_material_parameter(has_specular ? &specular : 0, + rend_data_ctx.set_batch_material_parameter(has_specular ? &specular : 0, { inv_bump_depth, bump_depth, 0.0f, 0.0f }, { intensity, max_def(intensity, 1.0f), intensity * 25.5f, 1.0f }, reflect_uv_scale, refract_uv_scale); } -static void draw_object_material_set_reflect(render_context* rctx, const mdl::ObjSubMeshArgs* args) { +static void draw_object_material_set_reflect( + render_data_context& rend_data_ctx, const mdl::ObjSubMeshArgs* args) { const obj_material_data* material = args->material; const std::vector* textures = args->textures; if (material->material.attrib.m.double_sided) - gl_rend_state.disable_cull_face(); + rend_data_ctx.state.disable_cull_face(); const obj_material_texture_data* texdata = material->material.texdata; for (int32_t i = 0; i < 1; i++, texdata++) { @@ -922,9 +905,9 @@ static void draw_object_material_set_reflect(render_context* rctx, const mdl::Ob tex_id = (*textures)[texdata->texture_index]; if (tex_id == -1) - tex_id = rctx->empty_texture_2d->glid; + tex_id = rctx_ptr->empty_texture_2d->glid; - gl_rend_state.active_bind_texture_2d(i, tex_id); + rend_data_ctx.state.active_bind_texture_2d(i, tex_id); int32_t wrap_s; if (texdata->attrib.m.mirror_u) @@ -943,7 +926,7 @@ static void draw_object_material_set_reflect(render_context* rctx, const mdl::Ob wrap_t = 0; texture* tex = texture_manager_get_texture(texture_id); - gl_rend_state.bind_sampler(i, rctx->samplers[(wrap_t * 3 + wrap_s) * 2 + rend_data_ctx.state.bind_sampler(i, rctx_ptr->samplers[(wrap_t * 3 + wrap_s) * 2 + (!tex || tex->max_mipmap_level > 0 ? 1 : 0)]); } @@ -964,14 +947,15 @@ static void draw_object_material_set_reflect(render_context* rctx, const mdl::Ob specular = material->material.color.specular; } - draw_object_material_set_uniform(material, true); - rctx->set_shader(rctx->draw_state->shader_index); - rctx->set_batch_material_color(diffuse, ambient, emission, + draw_object_material_set_uniform(rend_data_ctx, material, true); + rend_data_ctx.set_shader(rctx_ptr->draw_state->rend_data[rend_data_ctx.index].shader_index); + rend_data_ctx.set_batch_material_color(diffuse, ambient, emission, 0.0f, specular, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f); - draw_object_material_set_parameter(rctx, args->material); + draw_object_material_set_parameter(rend_data_ctx, args->material); } -static void draw_object_material_set_uniform(const obj_material_data* mat_data, bool disable_color_l) { +static void draw_object_material_set_uniform(render_data_context& rend_data_ctx, + const obj_material_data* mat_data, bool disable_color_l) { obj_shader_compo_member shader_compo = mat_data->material.shader_compo.m; obj_material_shader_attrib_member shader_info = mat_data->material.shader_info.m; @@ -985,83 +969,82 @@ static void draw_object_material_set_uniform(const obj_material_data* mat_data, if (shader_compo.color) { if (!shader_compo.color_l2) if (shader_compo.color_l1) { - uniform_value[U_TEXTURE_COUNT] = 2; + rend_data_ctx.shader_flags.arr[U_TEXTURE_COUNT] = 2; v4 = 3; } else { - uniform_value[U_TEXTURE_COUNT] = 1; + rend_data_ctx.shader_flags.arr[U_TEXTURE_COUNT] = 1; v4 = 1; } } else if (shader_compo.color_l1 && !shader_compo.color_l2) { - uniform_value[U_TEXTURE_COUNT] = 1; + rend_data_ctx.shader_flags.arr[U_TEXTURE_COUNT] = 1; v4 = 1; } else - uniform_value[U_TEXTURE_COUNT] = 0; + rend_data_ctx.shader_flags.arr[U_TEXTURE_COUNT] = 0; if (shader_compo.normal_01) - uniform_value[U_NORMAL] = 1; + rend_data_ctx.shader_flags.arr[U_NORMAL] = 1; if (shader_compo.specular) - uniform_value[U_SPECULAR] = 1; + rend_data_ctx.shader_flags.arr[U_SPECULAR] = 1; if (shader_compo.transparency) { - uniform_value[U_TRANSPARENCY] = 1; + rend_data_ctx.shader_flags.arr[U_TRANSPARENCY] = 1; v4 |= 2; } if (shader_compo.translucency) { - uniform_value[U_TRANSLUCENCY] = 1; + rend_data_ctx.shader_flags.arr[U_TRANSLUCENCY] = 1; v4 |= 2; } if (shader_compo.override_ibl) - uniform_value[U_ENV_MAP] = 1; + rend_data_ctx.shader_flags.arr[U_ENV_MAP] = 1; if (shader_info.aniso_direction != OBJ_MATERIAL_ANISO_DIRECTION_NORMAL) - uniform_value[U_ANISO] = shader_info.aniso_direction; + rend_data_ctx.shader_flags.arr[U_ANISO] = shader_info.aniso_direction; if (v4 == 1) - uniform_value[U45] = 0; + rend_data_ctx.shader_flags.arr[U45] = 0; else if (v4 == 2 || v4 == 3) - uniform_value[U45] = 1; + rend_data_ctx.shader_flags.arr[U45] = 1; } -static void draw_object_model_mat_load(render_context* rctx, const mat4& mat) { - rctx->set_batch_worlds(mat); -} - -static void draw_object_vertex_attrib_reset_default(const mdl::ObjSubMeshArgs* args) { +static void draw_object_vertex_attrib_reset_default( + render_data_context& rend_data_ctx, const mdl::ObjSubMeshArgs* args) { const obj_mesh* mesh = args->mesh; obj_vertex_format vertex_format = mesh->vertex_format; if (vertex_format & OBJ_VERTEX_BONE_DATA) - uniform_value[U_SKINNING] = 0; + rend_data_ctx.shader_flags.arr[U_SKINNING] = 0; if (args->morph_vertex_buffer) { - uniform_value[U_MORPH] = 0; - uniform_value[U_MORPH_COLOR] = 0; + rend_data_ctx.shader_flags.arr[U_MORPH] = 0; + rend_data_ctx.shader_flags.arr[U_MORPH_COLOR] = 0; } /*if (args->instances_count) - uniform_value[U_INSTANCE] = 0;*/ + rend_data_ctx.shader_flags.arr[U_INSTANCE] = 0;*/ - gl_rend_state.active_texture(0); + rend_data_ctx.state.active_texture(0); } -static void draw_object_vertex_attrib_reset_reflect(const mdl::ObjSubMeshArgs* args) { +static void draw_object_vertex_attrib_reset_reflect( + render_data_context& rend_data_ctx, const mdl::ObjSubMeshArgs* args) { const obj_mesh* mesh = args->mesh; obj_vertex_format vertex_format = mesh->vertex_format; if (vertex_format & OBJ_VERTEX_BONE_DATA) - uniform_value[U_SKINNING] = 0; + rend_data_ctx.shader_flags.arr[U_SKINNING] = 0; if (args->morph_vertex_buffer) { - uniform_value[U_MORPH] = 0; - uniform_value[U_MORPH_COLOR] = 0; + rend_data_ctx.shader_flags.arr[U_MORPH] = 0; + rend_data_ctx.shader_flags.arr[U_MORPH_COLOR] = 0; } - gl_rend_state.active_texture(0); + rend_data_ctx.state.active_texture(0); } -static void draw_object_vertex_attrib_set_default(render_context* rctx, const mdl::ObjSubMeshArgs* args) { +static void draw_object_vertex_attrib_set_default( + render_data_context& rend_data_ctx, const mdl::ObjSubMeshArgs* args) { const obj_mesh* mesh = args->mesh; obj_vertex_format vertex_format = mesh->vertex_format; @@ -1100,35 +1083,36 @@ static void draw_object_vertex_attrib_set_default(render_context* rctx, const md } } - rctx->set_batch_texcoord_transforms(mats); + rend_data_ctx.set_batch_texcoord_transforms(mats); if (vertex_format & OBJ_VERTEX_BONE_DATA) - uniform_value[U_SKINNING] = 1; + rend_data_ctx.shader_flags.arr[U_SKINNING] = 1; else - uniform_value[U_SKINNING] = 0; + rend_data_ctx.shader_flags.arr[U_SKINNING] = 0; if (args->morph_vertex_buffer) { - uniform_value[U_MORPH] = 1; + rend_data_ctx.shader_flags.arr[U_MORPH] = 1; if (vertex_format & OBJ_VERTEX_COLOR0) - uniform_value[U_MORPH_COLOR] = 1; + rend_data_ctx.shader_flags.arr[U_MORPH_COLOR] = 1; else - uniform_value[U_MORPH_COLOR] = 0; + rend_data_ctx.shader_flags.arr[U_MORPH_COLOR] = 0; - rctx->set_batch_morph_weight(args->morph_weight); + rend_data_ctx.set_batch_morph_weight(args->morph_weight); } else { - uniform_value[U_MORPH] = 0; - uniform_value[U_MORPH_COLOR] = 0; + rend_data_ctx.shader_flags.arr[U_MORPH] = 0; + rend_data_ctx.shader_flags.arr[U_MORPH_COLOR] = 0; } /*if (args->instances_count) - uniform_value[U_INSTANCE] = 1; + rend_data_ctx.shader_flags.arr[U_INSTANCE] = 1; else - uniform_value[U_INSTANCE] = 0;*/ + rend_data_ctx.shader_flags.arr[U_INSTANCE] = 0;*/ } -static void draw_object_vertex_attrib_set_reflect(render_context* rctx, const mdl::ObjSubMeshArgs* args) { +static void draw_object_vertex_attrib_set_reflect( + render_data_context& rend_data_ctx, const mdl::ObjSubMeshArgs* args) { const obj_mesh* mesh = args->mesh; obj_vertex_format vertex_format = mesh->vertex_format; @@ -1148,25 +1132,25 @@ static void draw_object_vertex_attrib_set_reflect(render_context* rctx, const md } } - rctx->set_batch_texcoord_transforms(mats); + rend_data_ctx.set_batch_texcoord_transforms(mats); if (vertex_format & OBJ_VERTEX_BONE_DATA) - uniform_value[U_SKINNING] = 1; + rend_data_ctx.shader_flags.arr[U_SKINNING] = 1; else - uniform_value[U_SKINNING] = 0; + rend_data_ctx.shader_flags.arr[U_SKINNING] = 0; if (args->morph_vertex_buffer) { - uniform_value[U_MORPH] = 1; + rend_data_ctx.shader_flags.arr[U_MORPH] = 1; if (vertex_format & OBJ_VERTEX_COLOR0) - uniform_value[U_MORPH_COLOR] = 1; + rend_data_ctx.shader_flags.arr[U_MORPH_COLOR] = 1; else - uniform_value[U_MORPH_COLOR] = 0; + rend_data_ctx.shader_flags.arr[U_MORPH_COLOR] = 0; - rctx->set_batch_morph_weight(args->morph_weight); + rend_data_ctx.set_batch_morph_weight(args->morph_weight); } else { - uniform_value[U_MORPH] = 0; - uniform_value[U_MORPH_COLOR] = 0; + rend_data_ctx.shader_flags.arr[U_MORPH] = 0; + rend_data_ctx.shader_flags.arr[U_MORPH_COLOR] = 0; } } diff --git a/src/CRE/mdl/draw_object.hpp b/src/CRE/mdl/draw_object.hpp index df2a7904..7e7fa872 100644 --- a/src/CRE/mdl/draw_object.hpp +++ b/src/CRE/mdl/draw_object.hpp @@ -12,22 +12,29 @@ #include "../render_context.hpp" namespace mdl { - extern void draw(render_context* rctx, obj_primitive_type primitive_type, uint32_t count, + extern void draw( + render_data_context& rend_data_ctx, obj_primitive_type primitive_type, uint32_t count, uint16_t start, uint16_t end, obj_index_format index_format, size_t indices); - extern void draw_etc_obj(render_context* rctx, const mdl::EtcObj* etc, const mat4* mat); - extern void draw_sub_mesh(render_context* rctx, const ObjSubMeshArgs* args, const mat4* mat, - void(*func)(render_context* rctx, const ObjSubMeshArgs* args)); - /*extern void draw_sub_mesh_show_vector(render_context* rctx, - const ObjSubMeshArgs* args, const mat4* model, int32_t show_vector);*/ - extern void draw_sub_mesh_default(render_context* rctx, const ObjSubMeshArgs* args); - extern void draw_sub_mesh_default_instanced(render_context* rctx, - const ObjSubMeshArgs* args, const mat4* mat); - extern void draw_sub_mesh_sss(render_context* rctx, const ObjSubMeshArgs* args); - extern void draw_sub_mesh_reflect(render_context* rctx, const ObjSubMeshArgs* args); - extern void draw_sub_mesh_reflect_reflect_map(render_context* rctx, const ObjSubMeshArgs* args); - extern void draw_sub_mesh_shadow(render_context* rctx, const ObjSubMeshArgs* args); - extern void draw_sub_mesh_translucent(render_context* rctx, const ObjSubMeshArgs* args); + extern void draw_etc_obj( + render_data_context& rend_data_ctx, const mdl::EtcObj* etc, const mat4* mat); + extern void draw_sub_mesh(render_data_context& rend_data_ctx, const ObjSubMeshArgs* args, + const mat4* mat, void(*func)(render_data_context& rend_data_ctx, + const ObjSubMeshArgs* args, const cam_data& cam, const mat4* mat), const cam_data& cam); + extern void draw_sub_mesh_default(render_data_context& rend_data_ctx, + const ObjSubMeshArgs* args, const cam_data& cam, const mat4* mat); + extern void draw_sub_mesh_default_instanced(render_data_context& rend_data_ctx, + const ObjSubMeshArgs* args, const cam_data& cam, const mat4* mat); + extern void draw_sub_mesh_sss(render_data_context& rend_data_ctx, + const ObjSubMeshArgs* args, const cam_data& cam, const mat4* mat); + extern void draw_sub_mesh_reflect(render_data_context& rend_data_ctx, + const ObjSubMeshArgs* args, const cam_data& cam, const mat4* mat); + extern void draw_sub_mesh_reflect_reflect_map(render_data_context& rend_data_ctx, + const ObjSubMeshArgs* args, const cam_data& cam, const mat4* mat); + extern void draw_sub_mesh_shadow(render_data_context& rend_data_ctx, + const ObjSubMeshArgs* args, const cam_data& cam, const mat4* mat); + extern void draw_sub_mesh_translucent(render_data_context& rend_data_ctx, + const ObjSubMeshArgs* args, const cam_data& cam, const mat4* mat); }; -extern void model_mat_face_camera_position(const mat4* view, const mat4* src, mat4* dst); -extern void model_mat_face_camera_view(const mat4* view, const mat4* src, mat4* dst); +extern void model_mat_face_camera_position(const cam_data& cam, const mat4* src, mat4* dst); +extern void model_mat_face_camera_view(const cam_data& cam, const mat4* src, mat4* dst); diff --git a/src/CRE/object.cpp b/src/CRE/object.cpp index f95961d5..998f7c5d 100644 --- a/src/CRE/object.cpp +++ b/src/CRE/object.cpp @@ -12,7 +12,7 @@ #include "../KKdLib/msgpack.hpp" #include "../KKdLib/str_utils.hpp" #include "data.hpp" -#include "gl_rend_state.hpp" +#include "gl_state.hpp" #include "render_context.hpp" #include "shader_ft.hpp" #include @@ -2407,12 +2407,12 @@ inline void objset_info_storage_free() { static GLuint create_index_buffer(size_t size, const void* data) { GLuint buffer = 0; glGenBuffers(1, &buffer); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer); + gl_state.bind_element_array_buffer(buffer); if (GLAD_GL_VERSION_4_4) glBufferStorage(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)size, data, 0); else glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)size, data, GL_STATIC_DRAW); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + gl_state.bind_element_array_buffer(0); if (glGetError()) { glDeleteBuffers(1, &buffer); @@ -2424,14 +2424,14 @@ static GLuint create_index_buffer(size_t size, const void* data) { static GLuint create_vertex_buffer(size_t size, const void* data, bool dynamic) { GLuint buffer = 0; glGenBuffers(1, &buffer); - glBindBuffer(GL_ARRAY_BUFFER, buffer); + gl_state.bind_array_buffer(buffer); if (GLAD_GL_VERSION_4_4) glBufferStorage(GL_ARRAY_BUFFER, (GLsizeiptr)size, data, dynamic ? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0); else glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)size, data, dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW); - glBindBuffer(GL_ARRAY_BUFFER, 0); + gl_state.bind_array_buffer(0); if (glGetError()) { glDeleteBuffers(1, &buffer); diff --git a/src/CRE/render.cpp b/src/CRE/render.cpp index 32f47b47..66e2448e 100644 --- a/src/CRE/render.cpp +++ b/src/CRE/render.cpp @@ -6,6 +6,7 @@ #include "render.hpp" #include "rob/rob.hpp" #include "gl_rend_state.hpp" +#include "gl_state.hpp" #include "render_context.hpp" #include "shader_ft.hpp" #include "stage.hpp" @@ -131,48 +132,49 @@ namespace rndr { } } - void Render::apply_post_process(camera* cam, texture* light_proj_tex, int32_t npr_param) { + void Render::apply_post_process(render_data_context& rend_data_ctx, + const cam_data& cam, texture* light_proj_tex, int32_t npr_param) { render_context* rctx = rctx_ptr; for (int32_t i = 0; i < 8; i++) - gl_rend_state.bind_sampler(i, 0); + rend_data_ctx.state.bind_sampler(i, 0); - dof->apply(&rend_texture[0], &rctx_ptr->render_buffer); + dof->apply(rend_data_ctx, &rend_texture[0], &rctx_ptr->render_buffer); - draw_lens_ghost(); + draw_lens_ghost(rend_data_ctx); - downsample(); + downsample(rend_data_ctx); reduce_tex_draw = 0; - get_blur(); + get_blur(rend_data_ctx); - calc_exposure(cam); - apply_tone_map(light_proj_tex, npr_param); + calc_exposure(rend_data_ctx, cam); + apply_tone_map(rend_data_ctx, light_proj_tex, npr_param); - apply_mlaa(taa_texture_selector, 2, ss_alpha_mask); + apply_mlaa(rend_data_ctx, taa_texture_selector, 2, ss_alpha_mask); for (int32_t i = 0; i < 16; i++) { if (!render_textures_data[i]) continue; - render_textures[i].Bind(); + render_textures[i].Bind(rend_data_ctx.state); texture* t = render_textures_data[i]; if (render_width[0] > t->width * 2 || render_height[0] > t->height * 2) - uniform_value[U_REDUCE] = 1; + rend_data_ctx.shader_flags.arr[U_REDUCE] = 1; else - uniform_value[U_REDUCE] = 0; + rend_data_ctx.shader_flags.arr[U_REDUCE] = 0; - gl_rend_state.set_viewport(0, 0, t->width, t->height); - gl_rend_state.active_bind_texture_2d(0, taa_tex[taa_texture_selector]->glid); - gl_rend_state.bind_sampler(0, rctx->render_samplers[0]); - shaders_ft.set(SHADER_FT_REDUCE); - draw_quad(render_post_width[0], render_post_height[0], + rend_data_ctx.state.set_viewport(0, 0, t->width, t->height); + rend_data_ctx.state.active_bind_texture_2d(0, taa_tex[taa_texture_selector]->glid); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); + draw_quad(rend_data_ctx, render_post_width[0], render_post_height[0], render_post_width_scale, render_post_height_scale, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); } - copy_to_frame_texture(rend_texture[0].GetColorTex(), + copy_to_frame_texture(rend_data_ctx, rend_texture[0].GetColorTex(), render_width[0], render_height[0], taa_tex[taa_texture_selector]->glid); if (taa) { @@ -185,7 +187,7 @@ namespace rndr { if (taa_blend < 0.0f || taa_blend >= 1.0f) taa_texture = taa_texture_selector; else { - gl_rend_state.begin_event("taa_or_blur"); + rend_data_ctx.state.begin_event("taa_or_blur"); bool blur; GLuint sampler; if (taa_blend > 0.99f) { @@ -198,43 +200,43 @@ namespace rndr { } taa_texture = 2; - taa_buffer[2].Bind(); - gl_rend_state.set_viewport(0, 0, render_width[0], render_height[0]); - gl_rend_state.active_bind_texture_2d(0, taa_tex[taa_texture_selector]->glid); - gl_rend_state.bind_sampler(0, sampler); + taa_buffer[2].Bind(rend_data_ctx.state); + rend_data_ctx.state.set_viewport(0, 0, render_width[0], render_height[0]); + rend_data_ctx.state.active_bind_texture_2d(0, taa_tex[taa_texture_selector]->glid); + rend_data_ctx.state.bind_sampler(0, sampler); if (blur) { - gl_rend_state.active_bind_texture_2d(2, rend_texture[0].depth_texture->glid); - gl_rend_state.bind_sampler(2, sampler); + rend_data_ctx.state.active_bind_texture_2d(2, rend_texture[0].depth_texture->glid); + rend_data_ctx.state.bind_sampler(2, sampler); mat4 mat; mat4_invert(&cam_view_projection, &mat); mat4_mul(&cam_view_projection_prev, &mat, &mat); - uniform_value[U_REDUCE] = 6; + rend_data_ctx.shader_flags.arr[U_REDUCE] = 6; camera_blur_shader_data shader_data = {}; shader_data.g_transform[0] = mat.row0; shader_data.g_transform[1] = mat.row1; shader_data.g_transform[2] = mat.row2; shader_data.g_transform[3] = mat.row3; - rctx->camera_blur_ubo.WriteMemory(shader_data); - rctx->camera_blur_ubo.Bind(1); + rctx->camera_blur_ubo.WriteMemory(rend_data_ctx.state, shader_data); + rend_data_ctx.state.bind_uniform_buffer_base(1, rctx->camera_blur_ubo); } else { int32_t taa_texture_selector = this->taa_texture_selector + 1; if (taa_texture_selector > taa) taa_texture_selector = 0; - gl_rend_state.active_bind_texture_2d(1, taa_tex[taa_texture_selector]->glid); - gl_rend_state.bind_sampler(1, sampler); - uniform_value[U_REDUCE] = 5; + rend_data_ctx.state.active_bind_texture_2d(1, taa_tex[taa_texture_selector]->glid); + rend_data_ctx.state.bind_sampler(1, sampler); + rend_data_ctx.shader_flags.arr[U_REDUCE] = 5; } - shaders_ft.set(SHADER_FT_REDUCE); + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); - draw_quad(render_post_width[0], render_post_height[0], + draw_quad(rend_data_ctx, render_post_width[0], render_post_height[0], render_post_width_scale, render_post_height_scale, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, taa_blend); - gl_rend_state.end_event(); + rend_data_ctx.state.end_event(); } if (taa) { @@ -244,77 +246,77 @@ namespace rndr { this->taa_texture_selector = taa_texture_selector; } - rctx->screen_buffer.Bind(); - gl_rend_state.set_viewport(0, 0, rctx->sprite_width, rctx->sprite_height); + rctx->screen_buffer.Bind(rend_data_ctx.state); + rend_data_ctx.state.set_viewport(0, 0, rctx->sprite_width, rctx->sprite_height); if (ssaa) { - gl_rend_state.active_bind_texture_2d(0, taa_tex[taa_texture]->glid); - gl_rend_state.bind_sampler(0, rctx->render_samplers[0]); - uniform_value[U_ALPHA_MASK] = ss_alpha_mask ? 1 : 0; - uniform_value[U_REDUCE] = 0; - shaders_ft.set(SHADER_FT_REDUCE); - draw_quad(render_post_width[0], render_post_height[0], + rend_data_ctx.state.active_bind_texture_2d(0, taa_tex[taa_texture]->glid); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); + rend_data_ctx.shader_flags.arr[U_ALPHA_MASK] = ss_alpha_mask ? 1 : 0; + rend_data_ctx.shader_flags.arr[U_REDUCE] = 0; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); + draw_quad(rend_data_ctx, render_post_width[0], render_post_height[0], render_post_width_scale, render_post_height_scale, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - uniform_value[U_ALPHA_MASK] = 0; + rend_data_ctx.shader_flags.arr[U_ALPHA_MASK] = 0; } else { - gl_rend_state.active_bind_texture_2d(0, taa_tex[taa_texture]->glid); + rend_data_ctx.state.active_bind_texture_2d(0, taa_tex[taa_texture]->glid); if (mag_filter == MAG_FILTER_NEAREST) - gl_rend_state.bind_sampler(0, rctx->render_samplers[1]); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[1]); else - gl_rend_state.bind_sampler(0, rctx->render_samplers[0]); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); switch (mag_filter) { case MAG_FILTER_NEAREST: case MAG_FILTER_BILINEAR: default: - uniform_value[U_MAGNIFY] = 0; + rend_data_ctx.shader_flags.arr[U_MAGNIFY] = 0; break; case MAG_FILTER_SHARPEN_5_TAP: - uniform_value[U_MAGNIFY] = 2; + rend_data_ctx.shader_flags.arr[U_MAGNIFY] = 2; break; case MAG_FILTER_SHARPEN_4_TAP: - uniform_value[U_MAGNIFY] = 3; + rend_data_ctx.shader_flags.arr[U_MAGNIFY] = 3; break; case MAG_FILTER_CONE_4_TAP: - uniform_value[U_MAGNIFY] = 4; + rend_data_ctx.shader_flags.arr[U_MAGNIFY] = 4; break; case MAG_FILTER_CONE_2_TAP: - uniform_value[U_MAGNIFY] = 5; + rend_data_ctx.shader_flags.arr[U_MAGNIFY] = 5; break; } - shaders_ft.set(SHADER_FT_MAGNIFY); - draw_quad(render_post_width[0], render_post_height[0], + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_MAGNIFY); + draw_quad(rend_data_ctx, render_post_width[0], render_post_height[0], render_post_width_scale, render_post_height_scale, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); } - shader::unbind(); + shader::unbind(rend_data_ctx.state); for (int32_t i = 0; i < 8; i++) - gl_rend_state.bind_sampler(i, 0); + rend_data_ctx.state.bind_sampler(i, 0); } - void Render::bind_render_texture(bool aet_back) { + void Render::bind_render_texture(p_gl_rend_state& p_gl_rend_st, bool aet_back) { if (aet_back) { - aet_back_texture.Bind(); + aet_back_texture.Bind(p_gl_rend_st); this->aet_back = 1; } else - rend_texture[0].Bind(); - gl_rend_state.set_viewport(0, 0, render_width[0], render_height[0]); + rend_texture[0].Bind(p_gl_rend_st); + p_gl_rend_st.set_viewport(0, 0, render_width[0], render_height[0]); } - void Render::calc_exposure_chara_data(camera* cam) { - shader::unbind(); + void Render::calc_exposure_chara_data(render_data_context& rend_data_ctx, const cam_data& cam) { + shader::unbind(rend_data_ctx.state); - gl_rend_state.set_color_mask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); - gl_rend_state.set_depth_mask(GL_FALSE); - gl_rend_state.disable_cull_face(); + rend_data_ctx.state.set_color_mask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); + rend_data_ctx.state.set_depth_mask(GL_FALSE); + rend_data_ctx.state.disable_cull_face(); - shaders_ft.set(SHADER_FT_SUN_NO_TEXTURED); - gl_rend_state.bind_vertex_array(rctx_ptr->common_vao); - rctx_ptr->sun_quad_ubo.Bind(0); + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_SUN_NO_TEXTURED); + rend_data_ctx.state.bind_vertex_array(rctx_ptr->common_vao); + rend_data_ctx.state.bind_uniform_buffer_base(0, rctx_ptr->sun_quad_ubo); ExposureCharaData* chara_data = exposure_chara_data; int32_t query_index = (this->exposure_query_index + 1) % 3; @@ -329,11 +331,11 @@ namespace rndr { mat4 mat = mat4_identity; rob_chr->sub_1405163C0(4, mat); - mat4_mul(&mat, &cam->view, &mat); + mat4_mul(&mat, &cam.get_view_mat(), &mat); mat4_mul_translate(&mat, max_face_depth + 0.1f, 0.0f, -0.06f, &mat); mat4_clear_rot(&mat, &mat); mat4_scale_rot(&mat, 0.0035f, &mat); - mat4_mul(&mat, &cam->projection, &mat); + mat4_mul(&mat, &cam.get_proj_mat(), &mat); sun_quad_shader_data shader_data = {}; mat4_transpose(&mat, &mat); @@ -342,10 +344,10 @@ namespace rndr { shader_data.g_transform[2] = mat.row2; shader_data.g_transform[3] = mat.row3; shader_data.g_emission = 0.0f; - rctx_ptr->sun_quad_ubo.WriteMemory(shader_data); + rctx_ptr->sun_quad_ubo.WriteMemory(rend_data_ctx.state, shader_data); glBeginQuery(GL_SAMPLES_PASSED, chara_data->query[next_query_index]); - shaders_ft.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); + rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); glEndQuery(GL_SAMPLES_PASSED); if (chara_data->query_data[next_query_index] == -1) @@ -363,35 +365,15 @@ namespace rndr { } } - gl_rend_state.bind_vertex_array(0); + rend_data_ctx.state.bind_vertex_array(0); - gl_rend_state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - gl_rend_state.set_depth_mask(GL_TRUE); - gl_rend_state.enable_cull_face(); + rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + rend_data_ctx.state.set_depth_mask(GL_TRUE); + rend_data_ctx.state.enable_cull_face(); } - void Render::calc_projection_matrix(mat4* mat, float_t fov, float_t aspect, float_t z_near, float_t z_far, - float_t left_offset, float_t right_offset, float_t bottom_offset, float_t top_offset) { - float_t tan_fov = (float_t)tan(fov * M_PI * (1.0 / 360.0)) * z_near; - float_t left = -tan_fov * aspect + tan_fov * aspect * left_offset; - float_t right = tan_fov * aspect + tan_fov * aspect * right_offset; - float_t bottom = -tan_fov + tan_fov * bottom_offset; - float_t top = tan_fov + tan_fov * top_offset; - - if (taa) { - float_t offset = taa_texture_selector == 1 ? -0.25f : 0.25f; - float_t left_right_offset = (right - left) * offset / (float_t)render_width[0]; - float_t bottom_top_offset = (top - bottom) * offset / (float_t)render_height[0]; - left += left_right_offset; - right += left_right_offset; - bottom += bottom_top_offset; - top += bottom_top_offset; - } - - mat4_frustrum(left, right, bottom, top, z_near, z_far, mat); - } - - void Render::draw_quad(int32_t width, int32_t height, float_t s0, float_t t0, float_t s1, float_t t1, + void Render::draw_quad(render_data_context& rend_data_ctx, + int32_t width, int32_t height, float_t s0, float_t t0, float_t s1, float_t t1, float_t scale, float_t param_x, float_t param_y, float_t param_z, float_t param_w) { s0 -= s1; t0 -= t1; @@ -404,13 +386,13 @@ namespace rndr { quad.g_color = { param_x, param_y, param_z, param_w }; quad.g_texture_lod = 0.0f; - rctx_ptr->quad_ubo.WriteMemory(quad); - rctx_ptr->quad_ubo.Bind(0); - gl_rend_state.bind_vertex_array(rctx_ptr->common_vao); - shaders_ft.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); + rctx_ptr->quad_ubo.WriteMemory(rend_data_ctx.state, quad); + rend_data_ctx.state.bind_uniform_buffer_base(0, rctx_ptr->quad_ubo); + rend_data_ctx.state.bind_vertex_array(rctx_ptr->common_vao); + rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); } - void Render::draw_lens_flare(camera* cam) { + void Render::draw_lens_flare(render_data_context& rend_data_ctx, const cam_data& cam) { static float_t flt_1411ACB84 = sinf(0.01365909819f); static float_t flt_1411ACB8C = tanf(0.01365909819f) * 2.0f * 0.94f; @@ -421,7 +403,7 @@ namespace rndr { if (!tex) return; - float_t v5 = tanf((float_t)(cam->get_fov() * DEG_TO_RAD) * 0.5f); + float_t v5 = tanf(cam.get_fov() * 0.5f); light_set* set = &rctx_ptr->light_set[LIGHT_SET_MAIN]; light_data* data = &set->lights[LIGHT_SUN]; @@ -444,7 +426,7 @@ namespace rndr { *(vec3*)&v44 = position; v44.w = 1.0f; - mat4_transform_vector(&cam->view_projection, &v44, &v44); + mat4_transform_vector(&cam.get_view_proj_mat(), &v44, &v44); float_t v13 = 1.0f / v44.w; float_t v14 = v44.x * v13; @@ -455,8 +437,10 @@ namespace rndr { v44.x = v14 * v44.w; v44.y = v15 * v44.w; - mat4_transform_vector(&cam->inv_view_projection, &v44, &v44); - ((pos_scale*)&lens_flare_pos)->get_screen_pos_scale(cam->view_projection, position); + mat4 inv_view_proj_mat; + mat4_invert(&cam.get_view_proj_mat(), &inv_view_proj_mat); + mat4_transform_vector(&inv_view_proj_mat, &v44, &v44); + ((pos_scale*)&lens_flare_pos)->get_screen_pos_scale(cam.get_view_proj_mat(), position); float_t v17 = lens_flare_pos.x - (float_t)width * 0.5f; float_t v19 = v5 / (float_t)height * 0.5f; @@ -471,10 +455,10 @@ namespace rndr { sun_quad_shader_data shader_data = {}; shader_data.g_emission = emission; - gl_rend_state.active_bind_texture_2d(0, tex); - shaders_ft.set(SHADER_FT_SUN); - gl_rend_state.bind_vertex_array(rctx_ptr->common_vao); - rctx_ptr->sun_quad_ubo.Bind(0); + rend_data_ctx.state.active_bind_texture_2d(0, tex); + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_SUN); + rend_data_ctx.state.bind_vertex_array(rctx_ptr->common_vao); + rend_data_ctx.state.bind_uniform_buffer_base(0, rctx_ptr->sun_quad_ubo); int32_t query_index = (lens_flare_query_index + 1) % 3; lens_flare_query_index = query_index; @@ -486,46 +470,46 @@ namespace rndr { if (lens_flare_query_data[next_query_index] == -1) lens_flare_query_data[next_query_index] = 0; - gl_rend_state.set_color_mask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); - gl_rend_state.set_depth_mask(GL_FALSE); - gl_rend_state.disable_cull_face(); + rend_data_ctx.state.set_color_mask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); + rend_data_ctx.state.set_depth_mask(GL_FALSE); + rend_data_ctx.state.disable_cull_face(); mat4 mat; - mat4_mul_translate(&cam->view, &position, &mat); + mat4_mul_translate(&cam.get_view_mat(), &position, &mat); mat4_clear_rot(&mat, &mat); mat4_scale_rot(&mat, v24 * 0.2f, &mat); - mat4_mul(&mat, &cam->projection, &mat); + mat4_mul(&mat, &cam.get_proj_mat(), &mat); mat4_transpose(&mat, &mat); shader_data.g_transform[0] = mat.row0; shader_data.g_transform[1] = mat.row1; shader_data.g_transform[2] = mat.row2; shader_data.g_transform[3] = mat.row3; - rctx_ptr->sun_quad_ubo.WriteMemory(shader_data); + rctx_ptr->sun_quad_ubo.WriteMemory(rend_data_ctx.state, shader_data); glBeginQuery(GL_SAMPLES_PASSED, lens_shaft_query[next_query_index]); - shaders_ft.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); + rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); glEndQuery(GL_SAMPLES_PASSED); - mat4_mul_translate(&cam->view, (vec3*)&v44, &mat); + mat4_mul_translate(&cam.get_view_mat(), (vec3*)&v44, &mat); mat4_clear_rot(&mat, &mat); mat4_scale_rot(&mat, v24 * 2.0f, &mat); - mat4_mul(&mat, &cam->projection, &mat); + mat4_mul(&mat, &cam.get_proj_mat(), &mat); mat4_transpose(&mat, &mat); shader_data.g_transform[0] = mat.row0; shader_data.g_transform[1] = mat.row1; shader_data.g_transform[2] = mat.row2; shader_data.g_transform[3] = mat.row3; - rctx_ptr->sun_quad_ubo.WriteMemory(shader_data); + rctx_ptr->sun_quad_ubo.WriteMemory(rend_data_ctx.state, shader_data); glBeginQuery(GL_SAMPLES_PASSED, lens_flare_query[next_query_index]); - shaders_ft.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); + rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); glEndQuery(GL_SAMPLES_PASSED); - gl_rend_state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - gl_rend_state.set_depth_mask(GL_TRUE); - gl_rend_state.enable_cull_face(); + rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + rend_data_ctx.state.set_depth_mask(GL_TRUE); + rend_data_ctx.state.enable_cull_face(); if (lens_shaft_query_data[query_index] != -1) { int32_t res = 0; @@ -542,31 +526,31 @@ namespace rndr { } if (emission.x + emission.y + emission.z > 0.0f) { - gl_rend_state.enable_blend(); - gl_rend_state.set_blend_func(GL_ONE, GL_ONE); - gl_rend_state.set_depth_mask(GL_FALSE); + rend_data_ctx.state.enable_blend(); + rend_data_ctx.state.set_blend_func(GL_ONE, GL_ONE); + rend_data_ctx.state.set_depth_mask(GL_FALSE); - mat4_mul_translate(&cam->view, &position, &mat); + mat4_mul_translate(&cam.get_view_mat(), &position, &mat); mat4_clear_rot(&mat, &mat); mat4_scale_rot(&mat, v24 * 1.1f, &mat); - mat4_mul(&mat, &cam->projection, &mat); + mat4_mul(&mat, &cam.get_proj_mat(), &mat); mat4_transpose(&mat, &mat); shader_data.g_transform[0] = mat.row0; shader_data.g_transform[1] = mat.row1; shader_data.g_transform[2] = mat.row2; shader_data.g_transform[3] = mat.row3; - rctx_ptr->sun_quad_ubo.WriteMemory(shader_data); + rctx_ptr->sun_quad_ubo.WriteMemory(rend_data_ctx.state, shader_data); - shaders_ft.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); + rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); - gl_rend_state.disable_blend(); - gl_rend_state.set_blend_func(GL_ONE, GL_ZERO); - gl_rend_state.set_depth_mask(GL_TRUE); + rend_data_ctx.state.disable_blend(); + rend_data_ctx.state.set_blend_func(GL_ONE, GL_ZERO); + rend_data_ctx.state.set_depth_mask(GL_TRUE); } - gl_rend_state.active_bind_texture_2d(0, 0); - gl_rend_state.bind_vertex_array(0); + rend_data_ctx.state.active_bind_texture_2d(0, 0); + rend_data_ctx.state.bind_vertex_array(0); if (lens_flare_appear_power <= 0.01f) lens_flare_appear_power = 0.0f; @@ -868,6 +852,14 @@ namespace rndr { return taa; } + vec2 Render::get_taa_offset() { + if (taa) { + float_t offset = taa_texture_selector == 1 ? -0.25f : 0.25f; + return offset / vec2((float_t)render_width[0], (float_t)render_height[0]); + } + return 0.0; + } + tone_map_method Render::get_tone_map() { return tone_map; } @@ -919,13 +911,13 @@ namespace rndr { rend_texture[0].Init(render_post_width[0], render_post_height[0], 0, GL_RGBA16F, GL_DEPTH_COMPONENT24); - glBindTexture(GL_TEXTURE_2D, rend_texture[0].GetColorTex()); + gl_state.bind_texture_2d(rend_texture[0].GetColorTex()); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glBindTexture(GL_TEXTURE_2D, rend_texture[0].GetDepthTex()); + gl_state.bind_texture_2d(rend_texture[0].GetDepthTex()); GLint swizzle[] = { GL_RED, GL_RED, GL_RED, GL_ONE }; glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle); - glBindTexture(GL_TEXTURE_2D, 0); + gl_state.bind_texture_2d(0); for (int32_t i = 0; i < 3; i++) { taa_tex[i] = texture_load_tex_2d(texture_id(0x25, texture_counter++), @@ -941,26 +933,26 @@ namespace rndr { temp_buffer.Init(render_post_width[0], render_post_height[0], 0, GL_RGBA8, GL_ZERO); sss_contour_texture = &mlaa_buffer; - glBindTexture(GL_TEXTURE_2D, mlaa_buffer.GetDepthTex()); + gl_state.bind_texture_2d(mlaa_buffer.GetDepthTex()); glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle); - glBindTexture(GL_TEXTURE_2D, 0); + gl_state.bind_texture_2d(0); for (int32_t i = 1; i < downsample_count; i++) { rend_texture[i].Init(render_post_width[i], render_post_height[i], 0, GL_RGBA16F, GL_ZERO); - glBindTexture(GL_TEXTURE_2D, rend_texture[i].GetColorTex()); + gl_state.bind_texture_2d(rend_texture[i].GetColorTex()); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glBindTexture(GL_TEXTURE_2D, 0); + gl_state.bind_texture_2d(0); } downsample_texture.Init(reduce_width[0], reduce_height[0], 0, GL_RGBA16F, GL_ZERO); - glBindTexture(GL_TEXTURE_2D, downsample_texture.GetColorTex()); + gl_state.bind_texture_2d(downsample_texture.GetColorTex()); const vec4 border_color = 0.0f; glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, (GLfloat*)&border_color); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); - glBindTexture(GL_TEXTURE_2D, 0); + gl_state.bind_texture_2d(0); field_3E8.Init(512, 256, 0, GL_RGBA8, GL_ZERO); @@ -978,14 +970,14 @@ namespace rndr { for (int32_t i = 0; i < 5; i++) { reduce_tex[i] = texture_load_tex_2d(texture_id(0x25, texture_counter++), GL_RGBA16F, reduce_width[i], reduce_height[i], 0, 0, 0); - glBindTexture(GL_TEXTURE_2D, reduce_tex[i]->glid); + gl_state.bind_texture_2d(reduce_tex[i]->glid); const vec4 border_color = 0.0f; glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, (GLfloat*)&border_color); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); } - glBindTexture(GL_TEXTURE_2D, 0); + gl_state.bind_texture_2d(0); reduce_texture[0].SetColorDepthTextures(reduce_tex[0]->glid); @@ -993,18 +985,18 @@ namespace rndr { GL_RGBA16F, 32, 2, 0, 0, 0); glGenTextures(1, &exposure_tex); - glBindTexture(GL_TEXTURE_2D, exposure_tex); + gl_state.bind_texture_2d(exposure_tex); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 2, 2, 0, GL_RGBA, GL_FLOAT, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glBindTexture(GL_TEXTURE_2D, 0); + gl_state.bind_texture_2d(0); exposure_texture.SetColorDepthTextures(exposure_tex); glGenTextures(1, &tonemap_lut_texture); - glBindTexture(GL_TEXTURE_2D, tonemap_lut_texture); + gl_state.bind_texture_2d(tonemap_lut_texture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RG16F, 16 * TONE_MAP_SAT_GAMMA_SAMPLES, 1, 0, GL_RG, GL_HALF_FLOAT, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); @@ -1012,7 +1004,7 @@ namespace rndr { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); const GLint swizzle[] = { GL_RED, GL_RED, GL_RED, GL_GREEN }; glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle); - glBindTexture(GL_TEXTURE_2D, 0); + gl_state.bind_texture_2d(0); generate_mlaa_area_texture(); @@ -1064,11 +1056,13 @@ namespace rndr { aet_back = 0; } - void Render::pre_proc(camera* cam) { + void Render::pre_proc(render_data_context& rend_data_ctx) { + cam_data& cam = rctx_ptr->render_manager->cam; + view_point_prev = view_point; interest_prev = interest; - cam->get_view_point(view_point); - cam->get_interest(interest); + view_point = cam.get_view_point(); + interest = cam.get_interest(); stage_index_prev = stage_index; if (task_stage_is_modern) @@ -1077,9 +1071,9 @@ namespace rndr { stage_index = task_stage_get_current_stage_index(); cam_view_projection_prev = cam_view_projection; - cam_view_projection = cam->view_projection; + cam_view_projection = cam.get_view_proj_mat(); - reset_exposure = cam->fast_change_hist1 && !cam->fast_change_hist0; + reset_exposure = rctx_ptr->camera->fast_change_hist1 && !rctx_ptr->camera->fast_change_hist0; if (reset_exposure) { float_t view_point_dist = vec3::distance(view_point, view_point_prev); @@ -1099,14 +1093,15 @@ namespace rndr { extern texture* task_movie_get_texture(int32_t index = 0); texture* tex = task_movie_get_texture(); if (tex) { - movie_textures[0].Bind(); - gl_rend_state.active_bind_texture_2d(0, tex->glid); - gl_rend_state.bind_sampler(0, rctx_ptr->render_samplers[0]); - gl_rend_state.set_viewport(0, 0, movie_textures_data[0]->width, movie_textures_data[0]->height); - uniform_value[U_REDUCE] = 0; - shaders_ft.set(SHADER_FT_REDUCE); - draw_quad(tex->width, tex->height, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - gl_rend_state.bind_framebuffer(0); + movie_textures[0].Bind(rend_data_ctx.state); + rend_data_ctx.state.active_bind_texture_2d(0, tex->glid); + rend_data_ctx.state.bind_sampler(0, rctx_ptr->render_samplers[0]); + rend_data_ctx.state.set_viewport(0, 0, movie_textures_data[0]->width, movie_textures_data[0]->height); + rend_data_ctx.shader_flags.arr[U_REDUCE] = 0; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); + draw_quad(rend_data_ctx, tex->width, tex->height, + 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); + rend_data_ctx.state.bind_framebuffer(0); } } } @@ -1195,13 +1190,13 @@ namespace rndr { rend_texture[0].Init(render_post_width[0], render_post_height[0], 0, GL_RGBA16F, GL_DEPTH_COMPONENT24); - glBindTexture(GL_TEXTURE_2D, rend_texture[0].GetColorTex()); + gl_state.bind_texture_2d(rend_texture[0].GetColorTex()); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glBindTexture(GL_TEXTURE_2D, rend_texture[0].GetDepthTex()); + gl_state.bind_texture_2d(rend_texture[0].GetDepthTex()); GLint swizzle[] = { GL_RED, GL_RED, GL_RED, GL_ONE }; glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle); - glBindTexture(GL_TEXTURE_2D, 0); + gl_state.bind_texture_2d(0); for (int32_t i = 0; i < 3; i++) { texture_id id = taa_tex[i]->id; @@ -1221,17 +1216,17 @@ namespace rndr { temp_buffer.Init(render_post_width[0], render_post_height[0], 0, GL_RGBA8, GL_ZERO); sss_contour_texture = &mlaa_buffer; - glBindTexture(GL_TEXTURE_2D, mlaa_buffer.GetDepthTex()); + gl_state.bind_texture_2d(mlaa_buffer.GetDepthTex()); glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle); for (int32_t i = 1; i < downsample_count; i++) { rend_texture[i].Init(render_post_width[i], render_post_height[i], 0, GL_RGBA16F, GL_ZERO); - glBindTexture(GL_TEXTURE_2D, rend_texture[i].GetColorTex()); + gl_state.bind_texture_2d(rend_texture[i].GetColorTex()); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); } - glBindTexture(GL_TEXTURE_2D, 0); + gl_state.bind_texture_2d(0); dof->resize(render_post_width[0], render_post_height[0]); @@ -1420,67 +1415,67 @@ namespace rndr { update = 1; } - void Render::downsample() { + void Render::downsample(render_data_context& rend_data_ctx) { render_context* rctx = rctx_ptr; - uniform_value[U_REDUCE] = 1; - shaders_ft.set(SHADER_FT_REDUCE); + rend_data_ctx.shader_flags.arr[U_REDUCE] = 1; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); for (int32_t i = 1; i < downsample_count - 1; i++) { - rend_texture[i].Bind(); - gl_rend_state.active_bind_texture_2d(0, rend_texture[i - 1].GetColorTex()); - gl_rend_state.bind_sampler(0, rctx->render_samplers[0]); - gl_rend_state.set_viewport(0, 0, render_width[i], render_height[i]); - draw_quad( + rend_texture[i].Bind(rend_data_ctx.state); + rend_data_ctx.state.active_bind_texture_2d(0, rend_texture[i - 1].GetColorTex()); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); + rend_data_ctx.state.set_viewport(0, 0, render_width[i], render_height[i]); + draw_quad(rend_data_ctx, render_post_width[i - 1], render_post_height[i - 1], render_post_width_scale, render_post_height_scale, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); } - uniform_value[U_REDUCE] = 3; - shaders_ft.set(SHADER_FT_REDUCE); + rend_data_ctx.shader_flags.arr[U_REDUCE] = 3; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); int32_t downsample = max_def(downsample_count - 2, 0); - gl_rend_state.set_viewport(0, 0, reduce_width[0], reduce_height[0]); - reduce_texture[0].Bind(); - gl_rend_state.active_bind_texture_2d(0, rend_texture[downsample].GetColorTex()); - gl_rend_state.bind_sampler(0, rctx->render_samplers[0]); - draw_quad( + rend_data_ctx.state.set_viewport(0, 0, reduce_width[0], reduce_height[0]); + reduce_texture[0].Bind(rend_data_ctx.state); + rend_data_ctx.state.active_bind_texture_2d(0, rend_texture[downsample].GetColorTex()); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); + draw_quad(rend_data_ctx, render_post_width[downsample], render_post_height[downsample], render_post_width_scale, render_post_height_scale, 0.0f, 0.0f, 1.0f, 1.1f, 1.1f, 1.1f, 0.0f); - downsample_texture.Bind(); - gl_rend_state.active_bind_texture_2d(0, reduce_tex[0]->glid); - gl_rend_state.bind_sampler(0, rctx->render_samplers[2]); + downsample_texture.Bind(rend_data_ctx.state); + rend_data_ctx.state.active_bind_texture_2d(0, reduce_tex[0]->glid); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[2]); for (int32_t i = 1; i < 5; i++) { float_t scale; if (i == 4) { scale = 1.0f; - uniform_value[U_EXPOSURE] = 0; - shaders_ft.set(SHADER_FT_EXPOSURE); + rend_data_ctx.shader_flags.arr[U_EXPOSURE] = 0; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_EXPOSURE); } else { scale = 0.75; - uniform_value[U_REDUCE] = 1; - shaders_ft.set(SHADER_FT_REDUCE); + rend_data_ctx.shader_flags.arr[U_REDUCE] = 1; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); } - gl_rend_state.set_viewport(0, 0, reduce_width[i], reduce_height[i]); - draw_quad(reduce_width[i - 1], reduce_height[i - 1], + rend_data_ctx.state.set_viewport(0, 0, reduce_width[i], reduce_height[i]); + draw_quad(rend_data_ctx, reduce_width[i - 1], reduce_height[i - 1], 1.0f, 1.0f, 0.0f, 0.0f, scale, 1.0f, 1.0f, 1.0f, 1.0f); - gl_rend_state.active_bind_texture_2d(0, reduce_tex[i]->glid); - gl_rend_state.bind_sampler(0, rctx->render_samplers[2]); + rend_data_ctx.state.active_bind_texture_2d(0, reduce_tex[i]->glid); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[2]); glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, reduce_width[i], reduce_height[i]); } } - void Render::transparency_combine(float_t alpha) { - transparency->combine(rend_texture, alpha); + void Render::transparency_combine(render_data_context& rend_data_ctx, float_t alpha) { + transparency->combine(rend_data_ctx, rend_texture, alpha); } - void Render::transparency_copy() { - transparency->copy(rend_texture[0].GetColorTex()); + void Render::transparency_copy(render_data_context& rend_data_ctx) { + transparency->copy(rend_data_ctx, rend_texture[0].GetColorTex()); } void Render::update_res(bool set, int32_t base_downsample) { @@ -1550,69 +1545,70 @@ namespace rndr { taa_blend = -1.0f; } - void Render::apply_mlaa(int32_t destination, int32_t source, int32_t ss_alpha_mask) { - gl_rend_state.begin_event("PostProcess::mlaa"); + void Render::apply_mlaa(render_data_context& rend_data_ctx, + int32_t destination, int32_t source, int32_t ss_alpha_mask) { + rend_data_ctx.state.begin_event("PostProcess::mlaa"); if (mlaa) { - mlaa_buffer.Bind(); - gl_rend_state.active_bind_texture_2d(0, taa_tex[source]->glid); - gl_rend_state.bind_sampler(0, rctx_ptr->render_samplers[1]); - uniform_value[U_MLAA] = 0; - shaders_ft.set(SHADER_FT_MLAA); - draw_quad(render_post_width[0], render_post_height[0], + mlaa_buffer.Bind(rend_data_ctx.state); + rend_data_ctx.state.active_bind_texture_2d(0, taa_tex[source]->glid); + rend_data_ctx.state.bind_sampler(0, rctx_ptr->render_samplers[1]); + rend_data_ctx.shader_flags.arr[U_MLAA] = 0; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_MLAA); + draw_quad(rend_data_ctx, render_post_width[0], render_post_height[0], render_post_width_scale, render_post_height_scale, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - temp_buffer.Bind(); - gl_rend_state.active_bind_texture_2d(0, mlaa_buffer.GetColorTex()); - gl_rend_state.active_bind_texture_2d(1, mlaa_area_texture); - gl_rend_state.bind_sampler(0, rctx_ptr->render_samplers[0]); - gl_rend_state.bind_sampler(1, rctx_ptr->render_samplers[3]); - uniform_value[U_MLAA] = 1; - uniform_value[U_MLAA_SEARCH] = 2; - shaders_ft.set(SHADER_FT_MLAA); - draw_quad(render_post_width[0], render_post_height[0], + temp_buffer.Bind(rend_data_ctx.state); + rend_data_ctx.state.active_bind_texture_2d(0, mlaa_buffer.GetColorTex()); + rend_data_ctx.state.active_bind_texture_2d(1, mlaa_area_texture); + rend_data_ctx.state.bind_sampler(0, rctx_ptr->render_samplers[0]); + rend_data_ctx.state.bind_sampler(1, rctx_ptr->render_samplers[3]); + rend_data_ctx.shader_flags.arr[U_MLAA] = 1; + rend_data_ctx.shader_flags.arr[U_MLAA_SEARCH] = 2; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_MLAA); + draw_quad(rend_data_ctx, render_post_width[0], render_post_height[0], render_post_width_scale, render_post_height_scale, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - taa_buffer[destination].Bind(); - gl_rend_state.active_bind_texture_2d(0, taa_tex[source]->glid); - gl_rend_state.active_bind_texture_2d(1, temp_buffer.GetColorTex()); - gl_rend_state.bind_sampler(0, rctx_ptr->render_samplers[1]); - gl_rend_state.bind_sampler(1, rctx_ptr->render_samplers[1]); - uniform_value[U_MLAA] = 2; - uniform_value[U_ALPHA_MASK] = ss_alpha_mask ? 1 : 0; - shaders_ft.set(SHADER_FT_MLAA); - draw_quad(render_post_width[0], render_post_height[0], + taa_buffer[destination].Bind(rend_data_ctx.state); + rend_data_ctx.state.active_bind_texture_2d(0, taa_tex[source]->glid); + rend_data_ctx.state.active_bind_texture_2d(1, temp_buffer.GetColorTex()); + rend_data_ctx.state.bind_sampler(0, rctx_ptr->render_samplers[1]); + rend_data_ctx.state.bind_sampler(1, rctx_ptr->render_samplers[1]); + rend_data_ctx.shader_flags.arr[U_MLAA] = 2; + rend_data_ctx.shader_flags.arr[U_ALPHA_MASK] = ss_alpha_mask ? 1 : 0; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_MLAA); + draw_quad(rend_data_ctx, render_post_width[0], render_post_height[0], render_post_width_scale, render_post_height_scale, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - uniform_value[U_ALPHA_MASK] = 0; - gl_rend_state.active_bind_texture_2d(0, 0); - gl_rend_state.active_bind_texture_2d(1, 0); + rend_data_ctx.shader_flags.arr[U_ALPHA_MASK] = 0; + rend_data_ctx.state.active_bind_texture_2d(0, 0); + rend_data_ctx.state.active_bind_texture_2d(1, 0); } else { - taa_buffer[destination].Bind(); - gl_rend_state.active_bind_texture_2d(0, taa_tex[source]->glid); - gl_rend_state.bind_sampler(0, rctx_ptr->render_samplers[1]); - uniform_value[U_REDUCE] = 0; - shaders_ft.set(SHADER_FT_REDUCE); - draw_quad(render_post_width[0], render_post_height[0], + taa_buffer[destination].Bind(rend_data_ctx.state); + rend_data_ctx.state.active_bind_texture_2d(0, taa_tex[source]->glid); + rend_data_ctx.state.bind_sampler(0, rctx_ptr->render_samplers[1]); + rend_data_ctx.shader_flags.arr[U_REDUCE] = 0; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); + draw_quad(rend_data_ctx, render_post_width[0], render_post_height[0], render_post_width_scale, render_post_height_scale, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); } - gl_rend_state.end_event(); + rend_data_ctx.state.end_event(); } - void Render::apply_tone_map(texture* light_proj_tex, int32_t npr_param) { + void Render::apply_tone_map(render_data_context& rend_data_ctx, texture* light_proj_tex, int32_t npr_param) { render_context* rctx = rctx_ptr; - gl_rend_state.begin_event("PostProcess::tone_map"); + rend_data_ctx.state.begin_event("PostProcess::tone_map"); update_tone_map_lut(); - uniform_value[U_TONE_MAP] = (int32_t)tone_map; - uniform_value[U_FLARE] = 0; - uniform_value[U_AET_BACK] = 0; - uniform_value[U_LIGHT_PROJ] = 0; + rend_data_ctx.shader_flags.arr[U_TONE_MAP] = (int32_t)tone_map; + rend_data_ctx.shader_flags.arr[U_FLARE] = 0; + rend_data_ctx.shader_flags.arr[U_AET_BACK] = 0; + rend_data_ctx.shader_flags.arr[U_LIGHT_PROJ] = 0; int32_t scene_fade_blend_func = this->scene_fade_blend_func[scene_fade_index]; @@ -1639,21 +1635,21 @@ namespace rndr { shader_data.g_texcoord_transforms[2] = { 1.0f, 0.0f, 0.0f, 0.0f }; shader_data.g_texcoord_transforms[3] = { 0.0f, 1.0f, 0.0f, 0.0f }; - gl_rend_state.active_bind_texture_2d(0, rend_texture[0].GetColorTex()); - gl_rend_state.bind_sampler(0, rctx->render_samplers[1]); - gl_rend_state.active_bind_texture_2d(1, reduce_tex_draw); - gl_rend_state.bind_sampler(1, rctx->render_samplers[2]); - gl_rend_state.active_bind_texture_2d(2, tonemap_lut_texture); - gl_rend_state.bind_sampler(2, rctx->render_samplers[0]); - gl_rend_state.active_bind_texture_2d(3, exposure_tex); - gl_rend_state.bind_sampler(3, rctx->render_samplers[3]); + rend_data_ctx.state.active_bind_texture_2d(0, rend_texture[0].GetColorTex()); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[1]); + rend_data_ctx.state.active_bind_texture_2d(1, reduce_tex_draw); + rend_data_ctx.state.bind_sampler(1, rctx->render_samplers[2]); + rend_data_ctx.state.active_bind_texture_2d(2, tonemap_lut_texture); + rend_data_ctx.state.bind_sampler(2, rctx->render_samplers[0]); + rend_data_ctx.state.active_bind_texture_2d(3, exposure_tex); + rend_data_ctx.state.bind_sampler(3, rctx->render_samplers[3]); if (lens_flare_texture) { const float_t aspect = (float_t)height / (float_t)width; - uniform_value[U_FLARE] = 1; - gl_rend_state.active_bind_texture_2d(4, lens_flare_texture); - gl_rend_state.bind_sampler(4, rctx->render_samplers[2]); + rend_data_ctx.shader_flags.arr[U_FLARE] = 1; + rend_data_ctx.state.active_bind_texture_2d(4, lens_flare_texture); + rend_data_ctx.state.bind_sampler(4, rctx->render_samplers[2]); mat4 mat; mat4_translate(0.5f, 0.5f, 0.0f, &mat); @@ -1668,9 +1664,9 @@ namespace rndr { shader_data.g_texcoord_transforms[5] = mat.row1; if (lens_shaft_scale < 50.0f) { - uniform_value[U_FLARE] = 2; - gl_rend_state.active_bind_texture_2d(5, lens_shaft_texture); - gl_rend_state.bind_sampler(5, rctx->render_samplers[2]); + rend_data_ctx.shader_flags.arr[U_FLARE] = 2; + rend_data_ctx.state.active_bind_texture_2d(5, lens_shaft_texture); + rend_data_ctx.state.bind_sampler(5, rctx->render_samplers[2]); mat4_translate(0.5f, 0.5f, 0.0f, &mat); mat4_scale_rot(&mat, lens_shaft_scale, lens_shaft_scale, 1.0f, &mat); @@ -1684,18 +1680,18 @@ namespace rndr { shader_data.g_texcoord_transforms[7] = mat.row1; } else { - gl_rend_state.active_bind_texture_2d(5, rctx->empty_texture_2d->glid); - gl_rend_state.bind_sampler(5, rctx->render_samplers[2]); + rend_data_ctx.state.active_bind_texture_2d(5, rctx->empty_texture_2d->glid); + rend_data_ctx.state.bind_sampler(5, rctx->render_samplers[2]); shader_data.g_texcoord_transforms[6] = { 1.0f, 0.0f, 0.0f, 0.0f }; shader_data.g_texcoord_transforms[7] = { 0.0f, 1.0f, 0.0f, 0.0f }; } } else { - gl_rend_state.active_bind_texture_2d(4, rctx->empty_texture_2d->glid); - gl_rend_state.bind_sampler(4, rctx->render_samplers[2]); - gl_rend_state.active_bind_texture_2d(5, rctx->empty_texture_2d->glid); - gl_rend_state.bind_sampler(5, rctx->render_samplers[2]); + rend_data_ctx.state.active_bind_texture_2d(4, rctx->empty_texture_2d->glid); + rend_data_ctx.state.bind_sampler(4, rctx->render_samplers[2]); + rend_data_ctx.state.active_bind_texture_2d(5, rctx->empty_texture_2d->glid); + rend_data_ctx.state.bind_sampler(5, rctx->render_samplers[2]); shader_data.g_texcoord_transforms[4] = { 1.0f, 0.0f, 0.0f, 0.0f }; shader_data.g_texcoord_transforms[5] = { 0.0f, 1.0f, 0.0f, 0.0f }; @@ -1704,41 +1700,41 @@ namespace rndr { } if (aet_back) { - gl_rend_state.active_bind_texture_2d(6, aet_back_tex->glid); - gl_rend_state.bind_sampler(6, rctx->render_samplers[2]); - uniform_value[U_AET_BACK] = 1; + rend_data_ctx.state.active_bind_texture_2d(6, aet_back_tex->glid); + rend_data_ctx.state.bind_sampler(6, rctx->render_samplers[2]); + rend_data_ctx.shader_flags.arr[U_AET_BACK] = 1; } if (light_proj_tex) { - uniform_value[U_LIGHT_PROJ] = 1; - gl_rend_state.active_bind_texture_2d(7, light_proj_tex->glid); - gl_rend_state.bind_sampler(7, rctx->render_samplers[2]); + rend_data_ctx.shader_flags.arr[U_LIGHT_PROJ] = 1; + rend_data_ctx.state.active_bind_texture_2d(7, light_proj_tex->glid); + rend_data_ctx.state.bind_sampler(7, rctx->render_samplers[2]); shader_data.g_flare_coef.z = 1.0f; } else { - gl_rend_state.active_bind_texture_2d(7, rctx->empty_texture_2d->glid); - gl_rend_state.bind_sampler(7, rctx->render_samplers[2]); + rend_data_ctx.state.active_bind_texture_2d(7, rctx->empty_texture_2d->glid); + rend_data_ctx.state.bind_sampler(7, rctx->render_samplers[2]); } if (aet_back && npr_param == 1) { - gl_rend_state.active_bind_texture_2d(14, rend_texture[0].GetDepthTex()); - gl_rend_state.bind_sampler(14, rctx->render_samplers[1]); + rend_data_ctx.state.active_bind_texture_2d(14, rend_texture[0].GetDepthTex()); + rend_data_ctx.state.bind_sampler(14, rctx->render_samplers[1]); } - rctx->tone_map_ubo.WriteMemory(shader_data); + rctx->tone_map_ubo.WriteMemory(rend_data_ctx.state, shader_data); - gl_rend_state.set_viewport(0, 0, render_width[0], render_height[0]); - taa_buffer[2].Bind(); - shaders_ft.set(SHADER_FT_TONEMAP); - rctx->tone_map_ubo.Bind(1); - gl_rend_state.bind_vertex_array(rctx->common_vao); - shaders_ft.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); - gl_rend_state.active_bind_texture_2d(2, 0); - gl_rend_state.end_event(); + rend_data_ctx.state.set_viewport(0, 0, render_width[0], render_height[0]); + taa_buffer[2].Bind(rend_data_ctx.state); + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_TONEMAP); + rend_data_ctx.state.bind_uniform_buffer_base(1, rctx->tone_map_ubo); + rend_data_ctx.state.bind_vertex_array(rctx->common_vao); + rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); + rend_data_ctx.state.active_bind_texture_2d(2, 0); + rend_data_ctx.state.end_event(); } - void Render::calc_exposure(camera* cam) { + void Render::calc_exposure(render_data_context& rend_data_ctx, const cam_data& cam) { render_context* rctx = rctx_ptr; bool v2 = false; @@ -1757,8 +1753,8 @@ namespace rndr { mat4 v42; mat4 v43; - mat4_mul(&v44, &cam->view, &v42); - mat4_mul(&v42, &cam->projection, &v43); + mat4_mul(&v44, &cam.view_mat, &v42); + mat4_mul(&v42, &cam.proj_mat, &v43); vec4 v41; vec4 v40; @@ -1786,7 +1782,7 @@ namespace rndr { v17 = 0.0f; float_t v18 = (float_t)height / (float_t)width; - float_t v20 = tanf(cam->fov * 0.5f * DEG_TO_RAD_FLOAT); + float_t v20 = tanf(cam.fov * 0.5f * DEG_TO_RAD_FLOAT); float_t v21 = 0.25f / sqrtf(powf(v20 * 3.4f, 2.0f) * (v41.z * v41.z)); float_t v22; if (v21 < 0.055f) @@ -1843,23 +1839,23 @@ namespace rndr { for (int32_t i = 0; i < 4 && i < ROB_CHARA_COUNT; i++, chara_data++) for (int32_t j = 0; j < 8; j++) exposure_measure.g_spot_coefficients[i * 8 + j] = chara_data->spot_coefficients[j]; - rctx->exposure_measure_ubo.WriteMemory(exposure_measure); + rctx->exposure_measure_ubo.WriteMemory(rend_data_ctx.state, exposure_measure); - gl_rend_state.set_viewport(0, 0, 32, 1); - downsample_texture.Bind(); + rend_data_ctx.state.set_viewport(0, 0, 32, 1); + downsample_texture.Bind(rend_data_ctx.state); - uniform_value[U_EXPOSURE] = 1; - shaders_ft.set(SHADER_FT_EXPOSURE); - rctx->exposure_measure_ubo.Bind(1); - gl_rend_state.active_bind_texture_2d(0, reduce_tex[4]->glid); - gl_rend_state.active_bind_texture_2d(1, reduce_tex[2]->glid); - gl_rend_state.bind_sampler(0, rctx->render_samplers[2]); - gl_rend_state.bind_sampler(1, rctx->render_samplers[2]); - draw_quad(1, 1, 1.0f, 1.0f, + rend_data_ctx.shader_flags.arr[U_EXPOSURE] = 1; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_EXPOSURE); + rend_data_ctx.state.bind_uniform_buffer_base(1, rctx->exposure_measure_ubo); + rend_data_ctx.state.active_bind_texture_2d(0, reduce_tex[4]->glid); + rend_data_ctx.state.active_bind_texture_2d(1, reduce_tex[2]->glid); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[2]); + rend_data_ctx.state.bind_sampler(1, rctx->render_samplers[2]); + draw_quad(rend_data_ctx, 1, 1, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - gl_rend_state.active_bind_texture_2d(0, exposure_history->glid); - gl_rend_state.bind_sampler(0, rctx->render_samplers[2]); + rend_data_ctx.state.active_bind_texture_2d(0, exposure_history->glid); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[2]); if (reset_exposure) glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 32, 1); else @@ -1867,17 +1863,17 @@ namespace rndr { exposure_history_counter = (exposure_history_counter + 1) % 32; } - gl_rend_state.set_viewport(0, 0, 1, 1); - exposure_texture.Bind(); - uniform_value[U_EXPOSURE] = 2; - shaders_ft.set(SHADER_FT_EXPOSURE); - gl_rend_state.active_bind_texture_2d(0, exposure_history->glid); - gl_rend_state.bind_sampler(0, rctx->render_samplers[0]); - draw_quad(1, 1, 1.0f, 1.0f, + rend_data_ctx.state.set_viewport(0, 0, 1, 1); + exposure_texture.Bind(rend_data_ctx.state); + rend_data_ctx.shader_flags.arr[U_EXPOSURE] = 2; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_EXPOSURE); + rend_data_ctx.state.active_bind_texture_2d(0, exposure_history->glid); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); + draw_quad(rend_data_ctx, 1, 1, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); } - void Render::calc_gaussian_blur(float_t start, float_t step, + void Render::calc_gaussian_blur(render_data_context& rend_data_ctx, float_t start, float_t step, int32_t kernel_size, float_t radius_scale, float_t intensity_scale) { auto calculate_gaussian_kernel = [&](float_t* gaussian_kernel, float_t radius, int32_t stride, int32_t offset) { @@ -1914,7 +1910,7 @@ namespace rndr { *(vec3*)&gaussian_coef.g_coef[i] = gauss[i] * intensity; gaussian_coef.g_coef[i].w = 0.0f; } - rctx_ptr->gaussian_coef_ubo.WriteMemory(gaussian_coef); + rctx_ptr->gaussian_coef_ubo.WriteMemory(rend_data_ctx.state, gaussian_coef); } void Render::calc_taa_blend() { @@ -1936,25 +1932,26 @@ namespace rndr { } } - void Render::copy_to_frame_texture(GLuint pre_pp_tex, int32_t wight, int32_t height, GLuint post_pp_tex) { + void Render::copy_to_frame_texture(render_data_context& rend_data_ctx, + GLuint pre_pp_tex, int32_t wight, int32_t height, GLuint post_pp_tex) { for (Render::FrameTexture& i : frame_texture) { if (!i.capture) continue; for (auto& j : i.data) { - if (!j.texture || j.render_texture.Bind() < 0) + if (!j.texture || j.render_texture.Bind(rend_data_ctx.state) < 0) continue; texture* dst_tex = j.texture; - gl_rend_state.active_bind_texture_2d(0, j.type == FRAME_TEXTURE_PRE_PP ? pre_pp_tex : post_pp_tex); - gl_rend_state.bind_sampler(0, rctx_ptr->render_samplers[0]); - gl_rend_state.set_viewport(0, 0, dst_tex->width, dst_tex->height); - uniform_value[U_REDUCE] = 0; - shaders_ft.set(SHADER_FT_REDUCE); - draw_quad(dst_tex->width, dst_tex->height, + rend_data_ctx.state.active_bind_texture_2d(0, j.type == FRAME_TEXTURE_PRE_PP ? pre_pp_tex : post_pp_tex); + rend_data_ctx.state.bind_sampler(0, rctx_ptr->render_samplers[0]); + rend_data_ctx.state.set_viewport(0, 0, dst_tex->width, dst_tex->height); + rend_data_ctx.shader_flags.arr[U_REDUCE] = 0; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); + draw_quad(rend_data_ctx, dst_tex->width, dst_tex->height, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - gl_rend_state.bind_framebuffer(0); + rend_data_ctx.state.bind_framebuffer(0); } if (&i - frame_texture) @@ -1992,7 +1989,7 @@ namespace rndr { data += 30; } - void Render::draw_lens_ghost() { + void Render::draw_lens_ghost(render_data_context& rend_data_ctx) { static const float_t v13[16] = { -0.70f, -0.30f, 0.35f, 0.50f, -0.45f, -0.80f, 0.20f, 0.41f, @@ -2034,7 +2031,7 @@ namespace rndr { const float_t angle_sin = sinf(angle); const float_t angle_cos = cosf(angle); - float_t* data = (float_t*)rctx_ptr->lens_ghost_vbo.MapMemory(); + float_t* data = (float_t*)rctx_ptr->lens_ghost_vbo.MapMemory(rend_data_ctx.state); if (!data) return; @@ -2052,23 +2049,23 @@ namespace rndr { make_ghost_quad((uint8_t)(i & 0x03), opacity, &mat, data); } - rctx_ptr->lens_ghost_vbo.UnmapMemory(); + rctx_ptr->lens_ghost_vbo.UnmapMemory(rend_data_ctx.state); - gl_rend_state.set_viewport(0, 0, render_width[0], render_height[0]); - rend_texture[0].Bind(); - gl_rend_state.enable_blend(); - gl_rend_state.set_blend_func(GL_ONE, GL_ONE); + rend_data_ctx.state.set_viewport(0, 0, render_width[0], render_height[0]); + rend_texture[0].Bind(rend_data_ctx.state); + rend_data_ctx.state.enable_blend(); + rend_data_ctx.state.set_blend_func(GL_ONE, GL_ONE); - uniform_value[U_REDUCE] = 4; - shaders_ft.set(SHADER_FT_REDUCE); - gl_rend_state.active_bind_texture_2d(0, lens_ghost_texture); - gl_rend_state.bind_sampler(0, rctx_ptr->render_samplers[0]); - gl_rend_state.bind_vertex_array(rctx_ptr->lens_ghost_vao); - shaders_ft.draw_arrays(GL_TRIANGLES, 0, (GLsizei)(lens_ghost_count * 6LL)); - gl_rend_state.bind_vertex_array(0); + rend_data_ctx.shader_flags.arr[U_REDUCE] = 4; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); + rend_data_ctx.state.active_bind_texture_2d(0, lens_ghost_texture); + rend_data_ctx.state.bind_sampler(0, rctx_ptr->render_samplers[0]); + rend_data_ctx.state.bind_vertex_array(rctx_ptr->lens_ghost_vao); + rend_data_ctx.state.draw_arrays(GL_TRIANGLES, 0, (GLsizei)(lens_ghost_count * 6LL)); + rend_data_ctx.state.bind_vertex_array(0); - gl_rend_state.disable_blend(); - gl_rend_state.set_blend_func(GL_ONE, GL_ZERO); + rend_data_ctx.state.disable_blend(); + rend_data_ctx.state.set_blend_func(GL_ONE, GL_ZERO); } void Render::generate_mlaa_area_texture() { @@ -2081,65 +2078,65 @@ namespace rndr { calculate_mlaa_area_texture_data(data, cross1, cross2); glGenTextures(1, &mlaa_area_texture); - glBindTexture(GL_TEXTURE_2D, mlaa_area_texture); + gl_state.bind_texture_2d(mlaa_area_texture); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexImage2D(GL_TEXTURE_2D, 0, GL_RG8, MLAA_SIDE_LEN, MLAA_SIDE_LEN, 0, GL_RG, GL_UNSIGNED_BYTE, data); - glBindTexture(GL_TEXTURE_2D, 0); + gl_state.bind_texture_2d(0); free_def(data); } - void Render::get_blur() { + void Render::get_blur(render_data_context& rend_data_ctx) { render_context* rctx = rctx_ptr; - uniform_value[U_ALPHA_MASK] = 0; - uniform_value[U_GAUSS] = 0; - shaders_ft.set(SHADER_FT_GAUSS); - calc_gaussian_blur(1.0f, 1.0f, 7, 0.8f, 1.0f); - rctx->gaussian_coef_ubo.Bind(1); + rend_data_ctx.shader_flags.arr[U_ALPHA_MASK] = 0; + rend_data_ctx.shader_flags.arr[U_GAUSS] = 0; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_GAUSS); + calc_gaussian_blur(rend_data_ctx, 1.0f, 1.0f, 7, 0.8f, 1.0f); + rend_data_ctx.state.bind_uniform_buffer_base(1, rctx->gaussian_coef_ubo); - downsample_texture.Bind(); + downsample_texture.Bind(rend_data_ctx.state); for (int32_t i = 1; i < 4; i++) { - gl_rend_state.set_viewport(0, 0, reduce_width[i], reduce_height[i]); - gl_rend_state.active_bind_texture_2d(0, reduce_tex[i]->glid); - gl_rend_state.bind_sampler(0, rctx->render_samplers[2]); - draw_quad(reduce_width[i], reduce_height[i], + rend_data_ctx.state.set_viewport(0, 0, reduce_width[i], reduce_height[i]); + rend_data_ctx.state.active_bind_texture_2d(0, reduce_tex[i]->glid); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[2]); + draw_quad(rend_data_ctx, reduce_width[i], reduce_height[i], 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f); glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, reduce_width[i], reduce_height[i]); } for (int32_t i = 1; i < 4; i++) { - gl_rend_state.set_viewport(0, 0, reduce_width[i], reduce_height[i]); - gl_rend_state.active_bind_texture_2d(0, reduce_tex[i]->glid); - gl_rend_state.bind_sampler(0, rctx->render_samplers[2]); - draw_quad(reduce_width[i], reduce_height[i], + rend_data_ctx.state.set_viewport(0, 0, reduce_width[i], reduce_height[i]); + rend_data_ctx.state.active_bind_texture_2d(0, reduce_tex[i]->glid); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[2]); + draw_quad(rend_data_ctx, reduce_width[i], reduce_height[i], 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f); glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, reduce_width[i], reduce_height[i]); } - uniform_value[U_GAUSS] = 1; - shaders_ft.set(SHADER_FT_GAUSS); + rend_data_ctx.shader_flags.arr[U_GAUSS] = 1; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_GAUSS); - gl_rend_state.set_viewport(0, 0, reduce_width[0], reduce_height[0]); - gl_rend_state.active_bind_texture_2d(0, reduce_tex[0]->glid); - gl_rend_state.bind_sampler(0, rctx->render_samplers[2]); - draw_quad(reduce_width[0], reduce_height[0], + rend_data_ctx.state.set_viewport(0, 0, reduce_width[0], reduce_height[0]); + rend_data_ctx.state.active_bind_texture_2d(0, reduce_tex[0]->glid); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[2]); + draw_quad(rend_data_ctx, reduce_width[0], reduce_height[0], 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, intensity.x * 0.5f, intensity.y * 0.5f, intensity.z * 0.5f, 1.0f); - uniform_value[U_REDUCE] = 7; - shaders_ft.set(SHADER_FT_REDUCE); + rend_data_ctx.shader_flags.arr[U_REDUCE] = 7; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); - gl_rend_state.set_viewport(0, 0, reduce_width[0], reduce_height[0]); - reduce_texture[0].Bind(); - gl_rend_state.active_bind_texture_2d(0, downsample_texture.GetColorTex()); - gl_rend_state.active_bind_texture_2d(1, reduce_tex[1]->glid); - gl_rend_state.active_bind_texture_2d(2, reduce_tex[2]->glid); - gl_rend_state.active_bind_texture_2d(3, reduce_tex[3]->glid); - gl_rend_state.bind_sampler(0, rctx->render_samplers[2]); - gl_rend_state.bind_sampler(1, rctx->render_samplers[2]); - gl_rend_state.bind_sampler(2, rctx->render_samplers[2]); - gl_rend_state.bind_sampler(3, rctx->render_samplers[2]); - draw_quad(reduce_width[3], reduce_height[3], + rend_data_ctx.state.set_viewport(0, 0, reduce_width[0], reduce_height[0]); + reduce_texture[0].Bind(rend_data_ctx.state); + rend_data_ctx.state.active_bind_texture_2d(0, downsample_texture.GetColorTex()); + rend_data_ctx.state.active_bind_texture_2d(1, reduce_tex[1]->glid); + rend_data_ctx.state.active_bind_texture_2d(2, reduce_tex[2]->glid); + rend_data_ctx.state.active_bind_texture_2d(3, reduce_tex[3]->glid); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[2]); + rend_data_ctx.state.bind_sampler(1, rctx->render_samplers[2]); + rend_data_ctx.state.bind_sampler(2, rctx->render_samplers[2]); + rend_data_ctx.state.bind_sampler(3, rctx->render_samplers[2]); + draw_quad(rend_data_ctx, reduce_width[3], reduce_height[3], 1.0f, 1.0f, 0.0f, 0.0f, 0.25f, 0.15f, 0.25f, 0.25f, 0.25f); reduce_tex_draw = reduce_tex[0]->glid; } @@ -2180,7 +2177,7 @@ namespace rndr { glTextureSubImage2D(tonemap_lut_texture, 0, 0, 0, 16 * TONE_MAP_SAT_GAMMA_SAMPLES, 1, GL_RG, GL_FLOAT, tex_data); else { - gl_rend_state.bind_texture_2d(tonemap_lut_texture); + gl_state.bind_texture_2d(tonemap_lut_texture); glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 16 * TONE_MAP_SAT_GAMMA_SAMPLES, 1, GL_RG, GL_FLOAT, tex_data); } diff --git a/src/CRE/render.hpp b/src/CRE/render.hpp index 7a45f1d0..1dae503f 100644 --- a/src/CRE/render.hpp +++ b/src/CRE/render.hpp @@ -13,6 +13,10 @@ #include "renderer/transparency.hpp" #include "camera.hpp" +struct cam_data; +struct p_gl_rend_state; +struct render_data_context; + namespace rndr { struct Render { enum MagFilterType { @@ -179,14 +183,14 @@ namespace rndr { Render(); ~Render(); - void apply_post_process(camera* cam, texture* light_proj_tex, int32_t npr_param); - void bind_render_texture(bool aet_back = false); - void calc_exposure_chara_data(camera* cam); - void calc_projection_matrix(mat4* mat, float_t fov, float_t aspect, float_t z_near, float_t z_far, - float_t left_offset, float_t right_offset, float_t bottom_offset, float_t top_offset); - void draw_quad(int32_t width, int32_t height, float_t s0, float_t t0, float_t s1, float_t t1, + void apply_post_process(render_data_context& rend_data_ctx, + const cam_data& cam, texture* light_proj_tex, int32_t npr_param); + void bind_render_texture(p_gl_rend_state& p_gl_rend_st, bool aet_back = false); + void calc_exposure_chara_data(render_data_context& rend_data_ctx, const cam_data& cam); + void draw_quad(render_data_context& rend_data_ctx, + int32_t width, int32_t height, float_t s0, float_t t0, float_t s1, float_t t1, float_t scale, float_t param_x, float_t param_y, float_t param_z, float_t param_w); - void draw_lens_flare(camera* cam); + void draw_lens_flare(render_data_context& rend_data_ctx, const cam_data& cam); bool frame_texture_cont_capture_set(bool value); void frame_texture_free(); int32_t frame_texture_load(int32_t slot, FrameTextureType type, texture* tex); @@ -217,6 +221,7 @@ namespace rndr { int32_t get_scene_fade_blend_func(); vec3 get_scene_fade_color(); int32_t get_taa(); + vec2 get_taa_offset(); tone_map_method get_tone_map(); void get_tone_trans(vec3& start, vec3& end); void init_render_buffers(int32_t width, int32_t height, @@ -225,7 +230,7 @@ namespace rndr { int32_t movie_texture_set(texture* movie_texture); void movie_texture_free(texture* movie_texture); void post_proc(); - void pre_proc(camera* cam); + void pre_proc(render_data_context& rend_data_ctx); int32_t render_texture_set(texture* render_texture, bool task_photo); void render_texture_free(texture* render_texture, bool task_photo); void reset_saturate_coeff(int32_t index, bool lock); @@ -256,22 +261,23 @@ namespace rndr { void set_taa(int32_t value); void set_tone_map(tone_map_method value); void set_tone_trans(const vec3& start, const vec3& end, int32_t index); - void transparency_combine(float_t alpha); - void transparency_copy(); + void transparency_combine(render_data_context& rend_data_ctx, float_t alpha); + void transparency_copy(render_data_context& rend_data_ctx); void update_res(bool set, int32_t base_downsample); private: - void apply_mlaa(int32_t destination, int32_t source, int32_t ss_alpha_mask); - void apply_tone_map(texture* light_proj_tex, int32_t npr_param); - void calc_exposure(camera* cam); - void calc_gaussian_blur(float_t start, float_t step, + void apply_mlaa(render_data_context& rend_data_ctx, int32_t destination, int32_t source, int32_t ss_alpha_mask); + void apply_tone_map(render_data_context& rend_data_ctx, texture* light_proj_tex, int32_t npr_param); + void calc_exposure(render_data_context& rend_data_ctx, const cam_data& cam); + void calc_gaussian_blur(render_data_context& rend_data_ctx, float_t start, float_t step, int32_t kernel_size, float_t radius_scale, float_t intensity_scale); void calc_taa_blend(); - void copy_to_frame_texture(GLuint pre_pp_tex, int32_t wight, int32_t height, GLuint post_pp_tex); - void draw_lens_ghost(); - void downsample(); + void copy_to_frame_texture(render_data_context& rend_data_ctx, + GLuint pre_pp_tex, int32_t wight, int32_t height, GLuint post_pp_tex); + void draw_lens_ghost(render_data_context& rend_data_ctx); + void downsample(render_data_context& rend_data_ctx); void generate_mlaa_area_texture(); - void get_blur(); + void get_blur(render_data_context& rend_data_ctx); void update_tone_map_lut(); }; } diff --git a/src/CRE/render_context.cpp b/src/CRE/render_context.cpp index 5d63a287..f5b06dc8 100644 --- a/src/CRE/render_context.cpp +++ b/src/CRE/render_context.cpp @@ -5,6 +5,8 @@ #include "render_context.hpp" #include "app_system_detail.hpp" +#include "gl_rend_state.hpp" +#include "gl_state.hpp" #include "shader_ft.hpp" #include "sound.hpp" #include "sprite.hpp" @@ -56,7 +58,11 @@ global_material_struct::global_material_struct() { refract_uv_scale = 0.1f; } -draw_state::draw_state() : wireframe(), wireframe_overlay(), shadow(), self_shadow(), +draw_state::render_data::render_data() : self_shadow(), shadow(), blend(), cull_front(), field_8() { + shader_index = -1; +} + +draw_state::draw_state() : wireframe(), wireframe_overlay(), shader_debug_flag(), use_global_material(), fog_height(), ex_data_mat(), field_68() { shader = true; shader_index = -1; @@ -68,6 +74,22 @@ bool draw_state::get_use_global_material() { return use_global_material; } +void draw_state::stats_update() { + stats_prev.reset(); + + for (draw_state::render_data& i : rend_data) { + stats_prev.object_draw_count += i.stats.object_draw_count; + stats_prev.object_translucent_draw_count += i.stats.object_translucent_draw_count; + stats_prev.object_reflect_draw_count += i.stats.object_reflect_draw_count; + stats_prev.field_C += i.stats.field_C; + stats_prev.field_10 += i.stats.field_10; + stats_prev.draw_count += i.stats.draw_count; + stats_prev.draw_triangle_count += i.stats.draw_triangle_count; + stats_prev.field_1C += i.stats.field_1C; + i.stats.reset(); + } +} + void draw_state::set_fog_height(bool value) { fog_height = value; } @@ -106,9 +128,9 @@ void sss_data::init() { init_data = true; } -void sss_data::set_texture(int32_t texture_index) { - gl_rend_state.active_bind_texture_2d(16, textures[texture_index].GetColorTex()); - gl_rend_state.active_texture(0); +void sss_data::set_texture(p_gl_rend_state& p_gl_rend_st, int32_t texture_index) { + p_gl_rend_st.active_bind_texture_2d(16, textures[texture_index].GetColorTex()); + p_gl_rend_st.active_texture(0); } light_proj::light_proj(int32_t width, int32_t height) : enable(), texture_id() { @@ -128,39 +150,59 @@ void light_proj::resize(int32_t width, int32_t height) { draw_texture.Init(width, height, 0, GL_RGBA8, GL_DEPTH_COMPONENT32F); } -bool light_proj::set() { +bool light_proj::set(render_data_context& rend_data_ctx, cam_data& cam) { if (!this) return false; static const vec4 color_clear = 0.0f; static const GLfloat depth_clear = 1.0f; - shadow_texture[0].Bind(); - gl_rend_state.set_viewport(0, 0, 2048, 512); - gl_rend_state.enable_depth_test(); - gl_rend_state.set_depth_mask(GL_TRUE); + shadow_texture[0].Bind(rend_data_ctx.state); + rend_data_ctx.state.set_viewport(0, 0, 2048, 512); + rend_data_ctx.state.enable_depth_test(); + rend_data_ctx.state.set_depth_mask(GL_TRUE); glClearBufferfv(GL_COLOR, 0, (float_t*)&color_clear); glClearBufferfv(GL_DEPTH, 0, &depth_clear); - if (set_mat(false)) { - rctx_ptr->draw_state->shader_index = SHADER_FT_SIL; - uniform_value[U_DEPTH] = 1; + if (set_mat(rend_data_ctx, cam, false)) { + rctx_ptr->draw_state->rend_data[rend_data_ctx.index].shader_index = SHADER_FT_SIL; + rend_data_ctx.shader_flags.arr[U_DEPTH] = 1; return true; } else { - draw_texture.Bind(); - draw_texture.SetViewport(); - gl_rend_state.enable_depth_test(); - gl_rend_state.set_depth_mask(GL_TRUE); + draw_texture.Bind(rend_data_ctx.state); + draw_texture.SetViewport(rend_data_ctx.state); + rend_data_ctx.state.enable_depth_test(); + rend_data_ctx.state.set_depth_mask(GL_TRUE); glClearBufferfv(GL_COLOR, 0, (float_t*)&color_clear); glClearBufferfv(GL_DEPTH, 0, &depth_clear); } return false; } -bool light_proj::set_mat(bool set_mat) { - render_context* rctx = rctx_ptr; - light_set* set = &rctx->light_set[LIGHT_SET_MAIN]; +static void light_proj_get_view_proj_mat(cam_data& cam, const vec3& view_point, const vec3& interest, + const float_t fov, const float_t aspect, const float_t min_distance, const float_t max_distance, mat4* mat) { + cam.set_view_point(view_point); + cam.set_interest(interest); + cam.set_up({ 0.0f, 1.0f, 0.0f }); + cam.calc_view_mat(); + cam.set_fov(fov * DEG_TO_RAD_FLOAT); + cam.set_aspect(aspect); + cam.set_min_distance(min_distance); + cam.set_max_distance(max_distance); + if (mat) { + cam.calc_persp_proj_mat_offset(0.5f, 0.5f); + cam.calc_view_proj_mat(); + *mat = cam.get_view_proj_mat(); + } + else { + cam.calc_persp_proj_mat(); + cam.calc_view_proj_mat(); + } +} + +bool light_proj::set_mat(render_data_context& rend_data_ctx, cam_data& cam, bool set_mat) { + light_set* set = &rctx_ptr->light_set[LIGHT_SET_MAIN]; light_data* data = &set->lights[LIGHT_PROJECTION]; if (data->get_type() != LIGHT_SPOT) return false; @@ -178,32 +220,14 @@ bool light_proj::set_mat(bool set_mat) { vec3 interest = position + spot_direction; if (set_mat) { - mat4 temp; - mat4_translate(0.5f, 0.5f, 0.5f, &temp); - mat4_scale_rot(&temp, 0.5f, 0.5f, 0.5f, &temp); - - mat4 proj; - mat4_persp(fov, 4.0f, 0.1f, 10.0f, &proj); - mat4_mul(&proj, &temp, &proj); - - mat4 view; - vec3 up = { 0.0f, 1.0f, 0.0f }; - mat4_look_at(&position, &interest, &up, &view); - mat4 mat; - mat4_mul(&view, &proj, &mat); - rctx->set_scene_light_projection(mat); - } - else { - mat4_persp(fov, 4.0f, 0.1f, 10.0f, &rctx->proj_mat); - - vec3 up = { 0.0f, 1.0f, 0.0f }; - mat4_look_at(&position, &interest, &up, &rctx->view_mat); - - mat4_mul(&rctx->view_mat, &rctx->proj_mat, &rctx->vp_mat); - - rctx->set_scene_projection_view(rctx->view_mat, rctx->proj_mat, position); + light_proj_get_view_proj_mat(cam, position, interest, + fov * RAD_TO_DEG_FLOAT, 4.0f, 0.1f, 10.0f, &mat); + rend_data_ctx.set_scene_light_projection(mat); } + else + light_proj_get_view_proj_mat(cam, position, interest, + fov * RAD_TO_DEG_FLOAT, 4.0f, 0.1f, 10.0f, 0); return true; } @@ -409,13 +433,13 @@ void render_data::obj_batch_data::reset() { } void render_data::init() { - buffer_shader.Create(sizeof(obj_shader_data)); - buffer_scene.Create(sizeof(obj_scene_data)); - buffer_batch.Create(sizeof(obj_batch_data)); + buffer_shader.Create(gl_state, sizeof(obj_shader_data)); + buffer_scene.Create(gl_state, sizeof(obj_scene_data)); + buffer_batch.Create(gl_state, sizeof(obj_batch_data)); if (GLAD_GL_VERSION_4_3) - buffer_skinning.Create(sizeof(obj_skinning_data)); + buffer_skinning.Create(gl_state, sizeof(obj_skinning_data)); else - buffer_skinning_ubo.Create(sizeof(obj_skinning_data)); + buffer_skinning_ubo.Create(gl_state, sizeof(obj_skinning_data)); buffer_shader_data.reset(); enum_or(flags, RENDER_DATA_SHADER_UPDATE); @@ -423,6 +447,7 @@ void render_data::init() { enum_or(flags, RENDER_DATA_SCENE_UPDATE); buffer_batch_data.reset(); enum_or(flags, RENDER_DATA_BATCH_UPDATE); + inv_view_mat = mat4_identity; } void render_data::free() { @@ -435,16 +460,61 @@ void render_data::free() { buffer_shader.Destroy(); } -void render_data::set(render_context* rctx) { - shaders_ft.set(shader_index); +void render_data::set_skinning_data(p_gl_rend_state& p_gl_rend_st, const mat4* mats, int32_t count) { + if (count == 2) { + mat4 temp; + mat4_transpose(&mats[0], &temp); + if (buffer_batch_data.g_joint[0] != temp.row0 + || buffer_batch_data.g_joint[1] != temp.row1 + || buffer_batch_data.g_joint[2] != temp.row2) { + buffer_batch_data.g_joint[0] = temp.row0; + buffer_batch_data.g_joint[1] = temp.row1; + buffer_batch_data.g_joint[2] = temp.row2; + enum_or(flags, RENDER_DATA_BATCH_UPDATE); + } + } + + if (sv_shared_storage_uniform_buffer) { + GLuint buffer = 0; + size_t offset = 0; + size_t size = 0; + if (rctx_ptr->get_shared_storage_uniform_buffer_data( + (size_t)mats, buffer, offset, size, !!GLAD_GL_VERSION_4_3)) + if (GLAD_GL_VERSION_4_3) + p_gl_rend_st.bind_shader_storage_buffer_range(0, buffer, (GLintptr)offset, (GLsizeiptr)size); + else + p_gl_rend_st.bind_uniform_buffer_range(6, buffer, (GLintptr)offset, (GLsizeiptr)size); + } + else { + vec4* g_joint_transforms = buffer_skinning_data.g_joint_transforms; + + mat4 mat; + for (int32_t i = 0; i < count; i++, mats++, g_joint_transforms += 3) { + mat4_transpose(mats, &mat); + g_joint_transforms[0] = mat.row0; + g_joint_transforms[1] = mat.row1; + g_joint_transforms[2] = mat.row2; + } + + if (GLAD_GL_VERSION_4_3) + buffer_skinning.WriteMemory(p_gl_rend_st, + 0, sizeof(vec4) * 3 * count, &buffer_skinning_data); + else + buffer_skinning_ubo.WriteMemory(p_gl_rend_st, + 0, sizeof(vec4) * 3 * count, &buffer_skinning_data); + } +} + +void render_data::set_state(p_gl_rend_state& p_gl_rend_st) { + shaders_ft.set(p_gl_rend_st, shader_flags, shader_index); if (flags & RENDER_DATA_SHADER_UPDATE) { - buffer_shader.WriteMemory(buffer_shader_data); + buffer_shader.WriteMemory(p_gl_rend_st, buffer_shader_data); enum_and(flags, ~RENDER_DATA_SHADER_UPDATE); } if (flags & RENDER_DATA_SCENE_UPDATE) { - buffer_scene.WriteMemory(buffer_scene_data); + buffer_scene.WriteMemory(p_gl_rend_st, buffer_scene_data); enum_and(flags, ~RENDER_DATA_SCENE_UPDATE); } @@ -457,7 +527,7 @@ void render_data::set(render_context* rctx) { mat4_transpose(&worlds, &worlds); mat4 temp; - mat4_mul(&worlds, &rctx->vp_mat, &temp); + mat4_mul(&worlds, &cam.view_proj_mat, &temp); mat4_transpose(&temp, &temp); buffer_batch_data.g_transforms[0] = temp.row0; buffer_batch_data.g_transforms[1] = temp.row1; @@ -470,7 +540,7 @@ void render_data::set(render_context* rctx) { buffer_batch_data.g_worlds_invtrans[1] = temp.row1; buffer_batch_data.g_worlds_invtrans[2] = temp.row2; - mat4_mul(&worlds, &rctx->view_mat, &worlds); + mat4_mul(&worlds, &cam.view_mat, &worlds); mat4_transpose(&worlds, &temp); buffer_batch_data.g_worldview[0] = temp.row0; buffer_batch_data.g_worldview[1] = temp.row1; @@ -491,28 +561,344 @@ void render_data::set(render_context* rctx) { buffer_batch_data.g_joint_inverse[1] = temp.row1; buffer_batch_data.g_joint_inverse[2] = temp.row2; - buffer_batch.WriteMemory(buffer_batch_data); + buffer_batch.WriteMemory(p_gl_rend_st, buffer_batch_data); enum_and(flags, ~RENDER_DATA_BATCH_UPDATE); } - buffer_shader.Bind(0); - buffer_scene.Bind(1); - buffer_batch.Bind(2); + p_gl_rend_st.bind_uniform_buffer_base(0, buffer_shader); + p_gl_rend_st.bind_uniform_buffer_base(1, buffer_scene); + p_gl_rend_st.bind_uniform_buffer_base(2, buffer_batch); - if (uniform_value[U_SKINNING] && !sv_shared_storage_uniform_buffer) + if (shader_flags.arr[U_SKINNING] && !sv_shared_storage_uniform_buffer) if (GLAD_GL_VERSION_4_3) - buffer_skinning.Bind(0); + p_gl_rend_st.bind_shader_storage_buffer_base(0, buffer_skinning); else - buffer_skinning_ubo.Bind(6); + p_gl_rend_st.bind_uniform_buffer_base(6, buffer_skinning_ubo); } void render_data::set_shader(uint32_t index) { shader_index = index; - buffer_shader_data.set_shader_flags(uniform_value); + buffer_shader_data.set_shader_flags(shader_flags.arr); enum_or(flags, RENDER_DATA_SHADER_UPDATE); } +render_data_context::render_data_context(int32_t index) : state(index), index(index), +data(rctx_ptr->data[index]), shader_flags(rctx_ptr->data[index].shader_flags){ + +} + +void render_data_context::get_scene_fog_params(render_data_context::fog_params& value) { + value.depth_color = data.buffer_scene_data.g_fog_depth_color; + value.height_params = data.buffer_scene_data.g_fog_height_params; + value.height_color = data.buffer_scene_data.g_fog_height_color; + value.bump_params = data.buffer_scene_data.g_fog_bump_params; + value.density = data.buffer_scene_data.g_fog_state_params.x; + value.start = data.buffer_scene_data.g_fog_state_params.y; + value.end = data.buffer_scene_data.g_fog_state_params.z; +} + +void render_data_context::get_scene_light(vec4* light_env_stage_diffuse, + vec4* light_env_stage_specular, vec4* light_chara_dir, vec4* light_chara_luce, + vec4* light_env_chara_diffuse, vec4* light_env_chara_specular) { + if (light_env_stage_diffuse) + *light_env_stage_diffuse = data.buffer_scene_data.g_light_env_stage_diffuse; + if (light_env_stage_specular) + *light_env_stage_specular = data.buffer_scene_data.g_light_env_stage_specular; + if (light_chara_dir) + *light_chara_dir = data.buffer_scene_data.g_light_chara_dir; + if (light_chara_luce) + *light_chara_luce = data.buffer_scene_data.g_light_chara_luce; + if (light_env_chara_diffuse) + *light_env_chara_diffuse = data.buffer_scene_data.g_light_env_chara_diffuse; + if (light_env_chara_specular) + *light_env_chara_specular = data.buffer_scene_data.g_light_env_chara_specular; +} + +void render_data_context::reset_shader_flags() { + shader_flags.arr[U_TEXTURE_COUNT] = 0; + shader_flags.arr[U_TEXTURE_BLEND] = 0; + shader_flags.arr[U_NORMAL] = 0; + shader_flags.arr[U_SPECULAR] = 0; + shader_flags.arr[U_TRANSPARENCY] = 0; + shader_flags.arr[U_TRANSLUCENCY] = 0; + shader_flags.arr[U_ENV_MAP] = 0; + shader_flags.arr[U0B] = 0; + shader_flags.arr[U_SPECULAR_IBL] = 0; + shader_flags.arr[U_FOG_STAGE] = 0; + shader_flags.arr[U_FOG_CHARA] = 0; + shader_flags.arr[U_ANISO] = 0; + shader_flags.arr[U_STAGE_SHADOW] = 0; + shader_flags.arr[U45] = 0; + shader_flags.arr[U_TEX_0_TYPE] = 0; + shader_flags.arr[U_TEX_1_TYPE] = 0; +} + +void render_data_context::set_batch_alpha_threshold(const float_t value) { + data.buffer_batch_data.g_max_alpha.z = value; + enum_or(data.flags, RENDER_DATA_BATCH_UPDATE); +} + +void render_data_context::set_batch_blend_color_offset_color( + const vec4& blend_color, const vec4& offset_color) { + data.buffer_batch_data.g_blend_color = blend_color; + data.buffer_batch_data.g_offset_color = offset_color; + enum_or(data.flags, RENDER_DATA_BATCH_UPDATE); +} + +void render_data_context::set_batch_material_color(const vec4& diffuse, const vec4& ambient, + const vec4& emission, const float_t material_shininess, const vec4& specular, + const vec4& fresnel_coefficients, const vec4& texture_color_coefficients, + const vec4& texture_color_offset, const vec4& texture_specular_coefficients, + const vec4& texture_specular_offset, const float_t shininess) { + data.buffer_batch_data.g_material_state_diffuse = diffuse; + data.buffer_batch_data.g_material_state_ambient = ambient; + data.buffer_batch_data.g_material_state_emission = emission; + data.buffer_batch_data.g_material_state_shininess = { material_shininess, 0.0f, 0.0f, 1.0f }; + data.buffer_batch_data.g_material_state_specular = specular; + data.buffer_batch_data.g_fresnel_coefficients = fresnel_coefficients; + data.buffer_batch_data.g_texture_color_coefficients = texture_color_coefficients; + data.buffer_batch_data.g_texture_color_offset = texture_color_offset; + data.buffer_batch_data.g_texture_specular_coefficients = texture_specular_coefficients; + data.buffer_batch_data.g_shininess.x = shininess; + data.buffer_batch_data.g_texture_specular_offset = texture_specular_offset; + enum_or(data.flags, RENDER_DATA_BATCH_UPDATE); +} + +void render_data_context::set_batch_material_color_emission(const vec4& emission) { + data.buffer_batch_data.g_material_state_emission = emission; + enum_or(data.flags, RENDER_DATA_BATCH_UPDATE); +} + +void render_data_context::set_batch_material_parameter(const vec4* specular, const vec4& bump_depth, + const vec4& intensity, const float_t reflect_uv_scale, const float_t refract_uv_scale) { + if (specular) + data.buffer_batch_data.g_material_state_specular = *specular; + data.buffer_batch_data.g_bump_depth = bump_depth; + data.buffer_batch_data.g_intensity = intensity; + data.buffer_batch_data.g_reflect_uv_scale.x = reflect_uv_scale; + data.buffer_batch_data.g_reflect_uv_scale.y = reflect_uv_scale; + data.buffer_batch_data.g_reflect_uv_scale.z = refract_uv_scale; + data.buffer_batch_data.g_reflect_uv_scale.w = refract_uv_scale; + enum_or(data.flags, RENDER_DATA_BATCH_UPDATE); +} + +void render_data_context::set_batch_min_alpha(const float_t value) { + data.buffer_batch_data.g_max_alpha.w = value; + enum_or(data.flags, RENDER_DATA_BATCH_UPDATE); +} + +void render_data_context::set_batch_morph_weight(const float_t value) { + data.buffer_batch_data.g_morph_weight.x = value; + data.buffer_batch_data.g_morph_weight.y = 1.0f - value; + data.buffer_batch_data.g_morph_weight.z = 0.0f; + data.buffer_batch_data.g_morph_weight.w = 0.0f; + enum_or(data.flags, RENDER_DATA_BATCH_UPDATE); +} + +void render_data_context::set_batch_scene_camera(const cam_data& cam) { + data.cam = cam; + + mat4_invert(&data.cam.get_view_mat(), &data.inv_view_mat); + + mat4 temp; + mat4_transpose(&data.cam.get_view_mat(), &temp); + data.buffer_scene_data.g_view[0] = temp.row0; + data.buffer_scene_data.g_view[1] = temp.row1; + data.buffer_scene_data.g_view[2] = temp.row2; + + mat4_invert(&data.cam.get_view_mat(), &temp); + mat4_transpose(&temp, &temp); + data.buffer_scene_data.g_view_inverse[0] = temp.row0; + data.buffer_scene_data.g_view_inverse[1] = temp.row1; + data.buffer_scene_data.g_view_inverse[2] = temp.row2; + + //mat4_mul(&data.cam.get_view_mat(), &data.cam.get_proj_mat(), &temp); + mat4_transpose(&data.cam.get_view_proj_mat(), &temp); + data.buffer_scene_data.g_projection_view[0] = temp.row0; + data.buffer_scene_data.g_projection_view[1] = temp.row1; + data.buffer_scene_data.g_projection_view[2] = temp.row2; + data.buffer_scene_data.g_projection_view[3] = temp.row3; + + *(vec3*)&data.buffer_scene_data.g_view_position = cam.get_view_point(); + data.buffer_scene_data.g_view_position.w = 0.0f; + //enum_or(data.flags, RENDER_DATA_BATCH_UPDATE | RENDER_DATA_SCENE_UPDATE); + enum_or(data.flags, RENDER_DATA_SCENE_UPDATE); +} + +void render_data_context::set_batch_sss_param(const vec4& sss_param) { + data.buffer_batch_data.g_sss_param = sss_param; + enum_or(data.flags, RENDER_DATA_BATCH_UPDATE); +} + +void render_data_context::set_batch_texcoord_transforms(const mat4 mats[2]) { + mat4 temp; + mat4_transpose(&mats[0], &temp); + data.buffer_batch_data.g_texcoord_transforms[0] = temp.row0; + data.buffer_batch_data.g_texcoord_transforms[1] = temp.row1; + mat4_transpose(&mats[1], &temp); + data.buffer_batch_data.g_texcoord_transforms[2] = temp.row0; + data.buffer_batch_data.g_texcoord_transforms[3] = temp.row1; + enum_or(data.flags, RENDER_DATA_BATCH_UPDATE); +} + +void render_data_context::set_batch_worlds(const mat4& mat) { + mat4 temp; + mat4_transpose(&mat, &temp); + if (data.buffer_batch_data.g_worlds[0] != temp.row0 + || data.buffer_batch_data.g_worlds[1] != temp.row1 + || data.buffer_batch_data.g_worlds[2] != temp.row2) { + data.buffer_batch_data.g_worlds[0] = temp.row0; + data.buffer_batch_data.g_worlds[1] = temp.row1; + data.buffer_batch_data.g_worlds[2] = temp.row2; + enum_or(data.flags, RENDER_DATA_BATCH_UPDATE); + } +} + +void render_data_context::set_glitter_render_data_state() { + data.buffer_shader_data.set_shader_flags(data.shader_flags.arr); + data.buffer_shader.WriteMemory(state, data.buffer_shader_data); + state.bind_uniform_buffer_base(0, data.buffer_shader); + + if (data.flags & RENDER_DATA_SCENE_UPDATE) { + data.buffer_scene.WriteMemory(state, data.buffer_scene_data); + enum_and(data.flags, ~RENDER_DATA_SCENE_UPDATE); + } + state.bind_uniform_buffer_base(1, data.buffer_scene); +} + +void render_data_context::set_render_data_state() { + data.set_state(state); +} + +void render_data_context::set_scene_fog_params(const render_data_context::fog_params& value) { + data.buffer_scene_data.g_fog_depth_color = value.depth_color; + data.buffer_scene_data.g_fog_height_params = value.height_params; + data.buffer_scene_data.g_fog_height_color = value.height_color; + data.buffer_scene_data.g_fog_bump_params = value.bump_params; + const float_t start = value.start; + const float_t end = value.end; + data.buffer_scene_data.g_fog_state_params.x = value.density; + data.buffer_scene_data.g_fog_state_params.y = value.start; + data.buffer_scene_data.g_fog_state_params.z = value.end; + data.buffer_scene_data.g_fog_state_params.w = end - start > 0.0f ? 1.0f / (end - start) : 0.0f; + enum_or(data.flags, RENDER_DATA_SCENE_UPDATE); +} + +void render_data_context::set_scene_framebuffer_size(const int32_t width, const int32_t height, + const int32_t render_width, const int32_t render_height) { + enum_or(data.flags, RENDER_DATA_SCENE_UPDATE); + data.buffer_scene_data.g_framebuffer_size.x = 1.0f / (float_t)width; + data.buffer_scene_data.g_framebuffer_size.y = 1.0f / (float_t)height; + data.buffer_scene_data.g_framebuffer_size.w = 1.0f / (float_t)render_height; + data.buffer_scene_data.g_framebuffer_size.z = 1.0f / (float_t)render_width; +} + +void render_data_context::set_scene_light(const mat4& irradiance_r_transforms, const mat4& irradiance_g_transforms, + const mat4& irradiance_b_transforms, const vec4& light_env_stage_diffuse, + const vec4& light_env_stage_specular, const vec4& light_env_chara_diffuse, + const vec4& light_env_chara_ambient, const vec4& light_env_chara_specular, + const vec4& light_env_reflect_diffuse, const vec4& light_env_reflect_ambient, + const vec4& light_env_proj_diffuse, const vec4& light_env_proj_specular, + const vec4& light_env_proj_position, const vec4& light_stage_dir, const vec4& light_stage_diff, + const vec4& light_stage_spec, const vec4& light_chara_dir, const vec4& light_chara_spec, + const vec4& light_chara_luce, const vec4& light_chara_back, const vec4& light_face_diff, + const vec4& chara_color0, const vec4& chara_color1, const vec4& chara_f_dir, const vec4& chara_f_ambient, + const vec4& chara_f_diffuse, const vec4& chara_tc_param, const mat4& normal_tangent_transforms, + const vec4& light_reflect_dir, const vec4& clip_plane, const vec4& npr_cloth_spec_color) { + mat4 temp; + mat4_transpose(&irradiance_r_transforms, &temp); + data.buffer_scene_data.g_irradiance_r_transforms[0] = temp.row0; + data.buffer_scene_data.g_irradiance_r_transforms[1] = temp.row1; + data.buffer_scene_data.g_irradiance_r_transforms[2] = temp.row2; + data.buffer_scene_data.g_irradiance_r_transforms[3] = temp.row3; + mat4_transpose(&irradiance_g_transforms, &temp); + data.buffer_scene_data.g_irradiance_g_transforms[0] = temp.row0; + data.buffer_scene_data.g_irradiance_g_transforms[1] = temp.row1; + data.buffer_scene_data.g_irradiance_g_transforms[2] = temp.row2; + data.buffer_scene_data.g_irradiance_g_transforms[3] = temp.row3; + mat4_transpose(&irradiance_b_transforms, &temp); + data.buffer_scene_data.g_irradiance_b_transforms[0] = temp.row0; + data.buffer_scene_data.g_irradiance_b_transforms[1] = temp.row1; + data.buffer_scene_data.g_irradiance_b_transforms[2] = temp.row2; + data.buffer_scene_data.g_irradiance_b_transforms[3] = temp.row3; + data.buffer_scene_data.g_light_env_stage_diffuse = light_env_stage_diffuse; + data.buffer_scene_data.g_light_env_stage_specular = light_env_stage_specular; + data.buffer_scene_data.g_light_env_chara_diffuse = light_env_chara_diffuse; + data.buffer_scene_data.g_light_env_chara_ambient = light_env_chara_ambient; + data.buffer_scene_data.g_light_env_chara_specular = light_env_chara_specular; + data.buffer_scene_data.g_light_env_reflect_diffuse = light_env_reflect_diffuse; + data.buffer_scene_data.g_light_env_reflect_ambient = light_env_reflect_ambient; + data.buffer_scene_data.g_light_env_proj_diffuse = light_env_proj_diffuse; + data.buffer_scene_data.g_light_env_proj_specular = light_env_proj_specular; + data.buffer_scene_data.g_light_env_proj_position = light_env_proj_position; + data.buffer_scene_data.g_light_stage_dir = light_stage_dir; + data.buffer_scene_data.g_light_stage_diff = light_stage_diff; + data.buffer_scene_data.g_light_stage_spec = light_stage_spec; + data.buffer_scene_data.g_light_chara_dir = light_chara_dir; + data.buffer_scene_data.g_light_chara_spec = light_chara_spec; + data.buffer_scene_data.g_light_chara_luce = light_chara_luce; + data.buffer_scene_data.g_light_chara_back = light_chara_back; + data.buffer_scene_data.g_light_face_diff = light_face_diff; + data.buffer_scene_data.g_chara_color0 = chara_color0; + data.buffer_scene_data.g_chara_color1 = chara_color1; + data.buffer_scene_data.g_chara_f_dir = chara_f_dir; + data.buffer_scene_data.g_chara_f_ambient = chara_f_ambient; + data.buffer_scene_data.g_chara_f_diffuse = chara_f_diffuse; + data.buffer_scene_data.g_chara_tc_param = chara_tc_param; + mat4_transpose(&normal_tangent_transforms, &temp); + data.buffer_scene_data.g_normal_tangent_transforms[0] = temp.row0; + data.buffer_scene_data.g_normal_tangent_transforms[1] = temp.row1; + data.buffer_scene_data.g_normal_tangent_transforms[2] = temp.row2; + data.buffer_scene_data.g_light_reflect_dir = light_reflect_dir; + data.buffer_scene_data.g_clip_plane = clip_plane; + data.buffer_scene_data.g_npr_cloth_spec_color = npr_cloth_spec_color; + enum_or(data.flags, RENDER_DATA_SCENE_UPDATE); +} + +void render_data_context::set_scene_light_projection(const mat4& light_projection) { + mat4 temp; + mat4_transpose(&light_projection, &temp); + data.buffer_scene_data.g_light_projection[0] = temp.row0; + data.buffer_scene_data.g_light_projection[1] = temp.row1; + data.buffer_scene_data.g_light_projection[2] = temp.row2; + data.buffer_scene_data.g_light_projection[3] = temp.row3; + enum_or(data.flags, RENDER_DATA_SCENE_UPDATE); +} + +void render_data_context::set_scene_shadow_params(const float_t esm_param, + const mat4 mats[2], const vec4& shadow_ambient, const vec4& shadow_ambient1) { + data.buffer_scene_data.g_esm_param = { esm_param, 0.0f, 0.0f, 0.0f }; + mat4 temp; + mat4_transpose(&mats[0], &temp); + data.buffer_scene_data.g_self_shadow_receivers[0] = temp.row0; + data.buffer_scene_data.g_self_shadow_receivers[1] = temp.row1; + data.buffer_scene_data.g_self_shadow_receivers[2] = temp.row2; + mat4_transpose(&mats[1], &temp); + data.buffer_scene_data.g_self_shadow_receivers[3] = temp.row0; + data.buffer_scene_data.g_self_shadow_receivers[4] = temp.row1; + data.buffer_scene_data.g_self_shadow_receivers[5] = temp.row2; + data.buffer_scene_data.g_shadow_ambient = shadow_ambient; + data.buffer_scene_data.g_shadow_ambient1 = shadow_ambient1; + enum_or(data.flags, RENDER_DATA_SCENE_UPDATE); +} + +void render_data_context::set_self_shadow(bool value) { + rctx_ptr->draw_state->rend_data[index].self_shadow = value; +} + +void render_data_context::set_shader(uint32_t index) { + data.set_shader(index); +} + +void render_data_context::set_shadow(bool value) { + rctx_ptr->draw_state->rend_data[index].shadow = value; +} + +void render_data_context::set_skinning_data(p_gl_rend_state& p_gl_rend_st, const mat4* mats, int32_t count) { + data.set_skinning_data(p_gl_rend_st, mats, count); +} + bool render_context::shared_storage_buffer::can_fill_data(size_t size) { return (size + align_val(offset, sv_min_storage_buffer_alignment)) <= this->size; } @@ -523,7 +909,7 @@ void render_context::shared_storage_buffer::create(size_t size) { size = size / sv_min_storage_buffer_alignment * sv_min_storage_buffer_alignment; - buffer.Create(size); + buffer.Create(gl_state, size); data = force_malloc(size); memset(data, 0, size); offset = 0; @@ -554,7 +940,7 @@ void render_context::shared_uniform_buffer::create(size_t size) { size = size / sv_min_uniform_buffer_alignment * sv_min_uniform_buffer_alignment; - buffer.Create(size); + buffer.Create(gl_state, size); data = force_malloc(size); memset(data, 0, size); offset = 0; @@ -581,9 +967,11 @@ sprite_width(), sprite_height(), screen_x_offset(), screen_y_offset(), screen_wi camera = new ::camera; draw_state = new ::draw_state; disp_manager = new mdl::DispManager; - render_manager = new rndr::RenderManager; + render_manager = new rndr::RenderManager; sss_data = new ::sss_data; + gl_state.get(); + static const float_t box_texcoords[] = { 1.0f, 0.0f, 0.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, @@ -620,10 +1008,10 @@ sprite_width(), sprite_height(), screen_x_offset(), screen_y_offset(), screen_wi }; glGenVertexArrays(1, &box_vao); - glBindVertexArray(box_vao); + gl_state.bind_vertex_array(box_vao); - box_vbo.Create(sizeof(box_texcoords), box_texcoords); - glBindBuffer(GL_ARRAY_BUFFER, box_vbo); + box_vbo.Create(gl_state, sizeof(box_texcoords), box_texcoords); + gl_state.bind_array_buffer(box_vbo); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, sizeof(float_t) * 16, (void*)0); @@ -635,39 +1023,41 @@ sprite_width(), sprite_height(), screen_x_offset(), screen_y_offset(), screen_wi glVertexAttribPointer(3, 4, GL_FLOAT, GL_FALSE, sizeof(float_t) * 16, (void*)(sizeof(float_t) * 12)); glGenVertexArrays(1, &lens_ghost_vao); - glBindVertexArray(lens_ghost_vao); + gl_state.bind_vertex_array(lens_ghost_vao); - lens_ghost_vbo.Create(sizeof(float_t) * 5 * (6 * 16)); - glBindBuffer(GL_ARRAY_BUFFER, lens_ghost_vbo); + lens_ghost_vbo.Create(gl_state, sizeof(float_t) * 5 * (6 * 16)); + gl_state.bind_array_buffer(lens_ghost_vbo); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float_t) * 5, (void*)0); glEnableVertexAttribArray(1); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(float_t) * 5, (void*)(sizeof(float_t) * 2)); - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindVertexArray(0); + gl_state.bind_array_buffer(0); + gl_state.bind_vertex_array(0); glGenVertexArrays(1, &common_vao); - camera_blur_ubo.Create(sizeof(camera_blur_shader_data)); - contour_coef_ubo.Create(sizeof(contour_coef_shader_data)); - contour_params_ubo.Create(sizeof(contour_params_shader_data)); - filter_scene_ubo.Create(sizeof(filter_scene_shader_data)); - esm_filter_batch_ubo.Create(sizeof(esm_filter_batch_shader_data)); - imgfilter_batch_ubo.Create(sizeof(imgfilter_batch_shader_data)); - exposure_measure_ubo.Create(sizeof(exposure_measure_shader_data)); - gaussian_coef_ubo.Create(sizeof(gaussian_coef_shader_data)); - glass_eye_batch_ubo.Create(sizeof(glass_eye_batch_shader_data)); - glitter_batch_ubo.Create(sizeof(glitter_batch_shader_data)); - quad_ubo.Create(sizeof(quad_shader_data)); - sprite_scene_ubo.Create(sizeof(sprite_scene_shader_data)); - sss_filter_gaussian_coef_ubo.Create(sizeof(sss_filter_gaussian_coef_shader_data)); - sun_quad_ubo.Create(sizeof(sun_quad_shader_data)); - tone_map_ubo.Create(sizeof(tone_map_shader_data)); - transparency_batch_ubo.Create(sizeof(transparency_batch_shader_data)); + camera_blur_ubo.Create(gl_state, sizeof(camera_blur_shader_data)); + contour_coef_ubo.Create(gl_state, sizeof(contour_coef_shader_data)); + contour_params_ubo.Create(gl_state, sizeof(contour_params_shader_data)); + filter_scene_ubo.Create(gl_state, sizeof(filter_scene_shader_data)); + esm_filter_batch_ubo.Create(gl_state, sizeof(esm_filter_batch_shader_data)); + imgfilter_batch_ubo.Create(gl_state, sizeof(imgfilter_batch_shader_data)); + exposure_measure_ubo.Create(gl_state, sizeof(exposure_measure_shader_data)); + gaussian_coef_ubo.Create(gl_state, sizeof(gaussian_coef_shader_data)); + glass_eye_batch_ubo.Create(gl_state, sizeof(glass_eye_batch_shader_data)); + glitter_batch_ubo.Create(gl_state, sizeof(glitter_batch_shader_data)); + quad_ubo.Create(gl_state, sizeof(quad_shader_data)); + sprite_scene_ubo.Create(gl_state, sizeof(sprite_scene_shader_data)); + sss_filter_gaussian_coef_ubo.Create(gl_state, sizeof(sss_filter_gaussian_coef_shader_data)); + sun_quad_ubo.Create(gl_state, sizeof(sun_quad_shader_data)); + tone_map_ubo.Create(gl_state, sizeof(tone_map_shader_data)); + transparency_batch_ubo.Create(gl_state, sizeof(transparency_batch_shader_data)); - data = {}; - data.init(); + for (render_data& i : data) { + i = {}; + i.init(); + } static const vec4 border_color = 0.0f; @@ -788,7 +1178,8 @@ render_context::~render_context() { glDeleteSamplers(4, render_samplers); glDeleteSamplers(18, samplers); - data.free(); + for (render_data& i : data) + i.free(); transparency_batch_ubo.Destroy(); tone_map_ubo.Destroy(); @@ -868,10 +1259,10 @@ void render_context::disp() { rctx_ptr = this; start_render_process(); disp_manager->refresh(); - draw_state->stats_prev = draw_state->stats; - draw_state->stats.reset(); + draw_state->stats_update(); sprite_manager_reset_req_list(); camera->update(); + render_manager->cam.get(camera); app::TaskWork::disp(); shadow_ptr_get()->ctrl(); int32_t sprite_index = sprite_manager_get_index(); @@ -880,7 +1271,7 @@ void render_context::disp() { extern void dw_gui_ctrl_disp(); dw_gui_ctrl_disp(); sprite_manager_set_index(sprite_index); - render_manager->rndpass_pre_proc(camera); + render_manager->rndpass_pre_proc(); render_manager->render_all(); render_manager->rndpass_post_proc(); render_manager->field_31C = false; @@ -1015,35 +1406,6 @@ void render_context::add_shared_storage_uniform_buffer_data(size_t index, } } -void render_context::get_scene_fog_params(render_context::fog_params& value) { - render_data* data = &this->data; - value.depth_color = data->buffer_scene_data.g_fog_depth_color; - value.height_params = data->buffer_scene_data.g_fog_height_params; - value.height_color = data->buffer_scene_data.g_fog_height_color; - value.bump_params = data->buffer_scene_data.g_fog_bump_params; - value.density = data->buffer_scene_data.g_fog_state_params.x; - value.start = data->buffer_scene_data.g_fog_state_params.y; - value.end = data->buffer_scene_data.g_fog_state_params.z; -} - -void render_context::get_scene_light(vec4* light_env_stage_diffuse, - vec4* light_env_stage_specular, vec4* light_chara_dir, vec4* light_chara_luce, - vec4* light_env_chara_diffuse, vec4* light_env_chara_specular) { - render_data* data = &this->data; - if (light_env_stage_diffuse) - *light_env_stage_diffuse = data->buffer_scene_data.g_light_env_stage_diffuse; - if (light_env_stage_specular) - *light_env_stage_specular = data->buffer_scene_data.g_light_env_stage_specular; - if (light_chara_dir) - *light_chara_dir = data->buffer_scene_data.g_light_chara_dir; - if (light_chara_luce) - *light_chara_luce = data->buffer_scene_data.g_light_chara_luce; - if (light_env_chara_diffuse) - *light_env_chara_diffuse = data->buffer_scene_data.g_light_env_chara_diffuse; - if (light_env_chara_specular) - *light_env_chara_specular = data->buffer_scene_data.g_light_env_chara_specular; -} - bool render_context::get_shared_storage_uniform_buffer_data(size_t index, GLuint& buffer, size_t& offset, size_t& size, bool storage) { if (storage) { @@ -1087,20 +1449,21 @@ void render_context::pre_proc() { const int32_t mat_count = min_def(args->mat_count, 256); const mat4* mats = args->mats; - vec4* g_joint_transforms = rctx->data.buffer_skinning_data.g_joint_transforms; + vec4 g_joint_transforms[768]; + vec4* g_joint_transform = g_joint_transforms; mat4 mat; - for (int32_t i = 0; i < mat_count; i++, mats++, g_joint_transforms += 3) { + for (int32_t i = 0; i < mat_count; i++, mats++, g_joint_transform += 3) { mat4_transpose(mats, &mat); - g_joint_transforms[0] = mat.row0; - g_joint_transforms[1] = mat.row1; - g_joint_transforms[2] = mat.row2; + g_joint_transform[0] = mat.row0; + g_joint_transform[1] = mat.row1; + g_joint_transform[2] = mat.row2; } const size_t buffer_size = sizeof(vec4) * 3 * 256; const size_t size = sizeof(vec4) * 3 * mat_count; rctx->add_shared_storage_uniform_buffer_data((size_t)args->mats, - rctx->data.buffer_skinning_data.g_joint_transforms, size, buffer_size, !!GLAD_GL_VERSION_4_3); + g_joint_transforms, size, buffer_size, !!GLAD_GL_VERSION_4_3); }; for (int32_t type = 0; type < mdl::OBJ_TYPE_MAX; type++) @@ -1148,7 +1511,7 @@ void render_context::pre_proc() { const size_t align = size - i.offset; if (align) memset((void*)((size_t)i.data + i.offset), 0, align); - i.buffer.WriteMemory(0, size, i.data); + i.buffer.WriteMemory(gl_state, 0, size, i.data); } for (render_context::shared_uniform_buffer& i : shared_uniform_buffers) { @@ -1159,7 +1522,7 @@ void render_context::pre_proc() { const size_t align = size - i.offset; if (align) memset((void*)((size_t)i.data + i.offset), 0, align); - i.buffer.WriteMemory(0, size, i.data); + i.buffer.WriteMemory(gl_state, 0, size, i.data); } } } @@ -1179,283 +1542,3 @@ void render_context::post_proc() { shared_uniform_buffer_entries.clear(); } } - -void render_context::set_batch_alpha_threshold(const float_t value) { - render_data* data = &this->data; - data->buffer_batch_data.g_max_alpha.z = value; - enum_or(data->flags, RENDER_DATA_BATCH_UPDATE); -} - -void render_context::set_batch_blend_color_offset_color( - const vec4& blend_color, const vec4& offset_color) { - render_data* data = &this->data; - data->buffer_batch_data.g_blend_color = blend_color; - data->buffer_batch_data.g_offset_color = offset_color; - enum_or(data->flags, RENDER_DATA_BATCH_UPDATE); -} - -void render_context::set_batch_joint(const mat4& mat) { - render_data* data = &this->data; - mat4 temp; - mat4_transpose(&mat, &temp); - if (data->buffer_batch_data.g_joint[0] != temp.row0 - || data->buffer_batch_data.g_joint[1] != temp.row1 - || data->buffer_batch_data.g_joint[2] != temp.row2) { - data->buffer_batch_data.g_joint[0] = temp.row0; - data->buffer_batch_data.g_joint[1] = temp.row1; - data->buffer_batch_data.g_joint[2] = temp.row2; - enum_or(data->flags, RENDER_DATA_BATCH_UPDATE); - } -} - -void render_context::set_batch_material_color(const vec4& diffuse, const vec4& ambient, - const vec4& emission, const float_t material_shininess, const vec4& specular, - const vec4& fresnel_coefficients, const vec4& texture_color_coefficients, - const vec4& texture_color_offset, const vec4& texture_specular_coefficients, - const vec4& texture_specular_offset, const float_t shininess) { - render_data* data = &this->data; - data->buffer_batch_data.g_material_state_diffuse = diffuse; - data->buffer_batch_data.g_material_state_ambient = ambient; - data->buffer_batch_data.g_material_state_emission = emission; - data->buffer_batch_data.g_material_state_shininess = { material_shininess, 0.0f, 0.0f, 1.0f }; - data->buffer_batch_data.g_material_state_specular = specular; - data->buffer_batch_data.g_fresnel_coefficients = fresnel_coefficients; - data->buffer_batch_data.g_texture_color_coefficients = texture_color_coefficients; - data->buffer_batch_data.g_texture_color_offset = texture_color_offset; - data->buffer_batch_data.g_texture_specular_coefficients = texture_specular_coefficients; - data->buffer_batch_data.g_shininess.x = shininess; - data->buffer_batch_data.g_texture_specular_offset = texture_specular_offset; - enum_or(data->flags, RENDER_DATA_BATCH_UPDATE); -} - -void render_context::set_batch_material_color_emission(const vec4& emission) { - render_data* data = &this->data; - data->buffer_batch_data.g_material_state_emission = emission; - enum_or(data->flags, RENDER_DATA_BATCH_UPDATE); -} - -void render_context::set_batch_material_parameter(const vec4* specular, const vec4& bump_depth, - const vec4& intensity, const float_t reflect_uv_scale, const float_t refract_uv_scale) { - render_data* data = &this->data; - if (specular) - data->buffer_batch_data.g_material_state_specular = *specular; - data->buffer_batch_data.g_bump_depth = bump_depth; - data->buffer_batch_data.g_intensity = intensity; - data->buffer_batch_data.g_reflect_uv_scale.x = reflect_uv_scale; - data->buffer_batch_data.g_reflect_uv_scale.y = reflect_uv_scale; - data->buffer_batch_data.g_reflect_uv_scale.z = refract_uv_scale; - data->buffer_batch_data.g_reflect_uv_scale.w = refract_uv_scale; - enum_or(data->flags, RENDER_DATA_BATCH_UPDATE); -} - -void render_context::set_batch_min_alpha(const float_t value) { - render_data* data = &this->data; - data->buffer_batch_data.g_max_alpha.w = value; - enum_or(data->flags, RENDER_DATA_BATCH_UPDATE); -} - -void render_context::set_batch_morph_weight(const float_t value) { - render_data* data = &this->data; - data->buffer_batch_data.g_morph_weight.x = value; - data->buffer_batch_data.g_morph_weight.y = 1.0f - value; - data->buffer_batch_data.g_morph_weight.z = 0.0f; - data->buffer_batch_data.g_morph_weight.w = 0.0f; - enum_or(data->flags, RENDER_DATA_BATCH_UPDATE); -} - -void render_context::set_batch_sss_param(const vec4& sss_param) { - render_data* data = &this->data; - data->buffer_batch_data.g_sss_param = sss_param; - enum_or(data->flags, RENDER_DATA_BATCH_UPDATE); -} - -void render_context::set_batch_texcoord_transforms(const mat4 mats[2]) { - render_data* data = &this->data; - mat4 temp; - mat4_transpose(&mats[0], &temp); - data->buffer_batch_data.g_texcoord_transforms[0] = temp.row0; - data->buffer_batch_data.g_texcoord_transforms[1] = temp.row1; - mat4_transpose(&mats[1], &temp); - data->buffer_batch_data.g_texcoord_transforms[2] = temp.row0; - data->buffer_batch_data.g_texcoord_transforms[3] = temp.row1; - enum_or(data->flags, RENDER_DATA_BATCH_UPDATE); -} - -void render_context::set_batch_worlds(const mat4& mat) { - render_data* data = &this->data; - mat4 temp; - mat4_transpose(&mat, &temp); - if (data->buffer_batch_data.g_worlds[0] != temp.row0 - || data->buffer_batch_data.g_worlds[1] != temp.row1 - || data->buffer_batch_data.g_worlds[2] != temp.row2) { - data->buffer_batch_data.g_worlds[0] = temp.row0; - data->buffer_batch_data.g_worlds[1] = temp.row1; - data->buffer_batch_data.g_worlds[2] = temp.row2; - enum_or(data->flags, RENDER_DATA_BATCH_UPDATE); - } -} - -void render_context::set_glitter_render_data() { - render_data* data = &this->data; - data->buffer_shader_data.set_shader_flags(uniform_value); - data->buffer_shader.WriteMemory(data->buffer_shader_data); - data->buffer_shader.Bind(0); - - if (data->flags & RENDER_DATA_SCENE_UPDATE) { - data->buffer_scene.WriteMemory(data->buffer_scene_data); - enum_and(data->flags, ~RENDER_DATA_SCENE_UPDATE); - } - data->buffer_scene.Bind(1); -} - -void render_context::set_render_data() { - data.set(this); -} - -void render_context::set_scene_fog_params(const render_context::fog_params& value) { - render_data* data = &this->data; - data->buffer_scene_data.g_fog_depth_color = value.depth_color; - data->buffer_scene_data.g_fog_height_params = value.height_params; - data->buffer_scene_data.g_fog_height_color = value.height_color; - data->buffer_scene_data.g_fog_bump_params = value.bump_params; - const float_t start = value.start; - const float_t end = value.end; - data->buffer_scene_data.g_fog_state_params.x = value.density; - data->buffer_scene_data.g_fog_state_params.y = value.start; - data->buffer_scene_data.g_fog_state_params.z = value.end; - data->buffer_scene_data.g_fog_state_params.w = end - start > 0.0f ? 1.0f / (end - start) : 0.0f; - enum_or(data->flags, RENDER_DATA_SCENE_UPDATE); -} - -void render_context::set_scene_framebuffer_size(const int32_t width, const int32_t height, - const int32_t render_width, const int32_t render_height) { - render_data* data = &this->data; - enum_or(data->flags, RENDER_DATA_SCENE_UPDATE); - data->buffer_scene_data.g_framebuffer_size.x = 1.0f / (float_t)width; - data->buffer_scene_data.g_framebuffer_size.y = 1.0f / (float_t)height; - data->buffer_scene_data.g_framebuffer_size.w = 1.0f / (float_t)render_height; - data->buffer_scene_data.g_framebuffer_size.z = 1.0f / (float_t)render_width; -} - -void render_context::set_scene_light(const mat4& irradiance_r_transforms, const mat4& irradiance_g_transforms, - const mat4& irradiance_b_transforms, const vec4& light_env_stage_diffuse, - const vec4& light_env_stage_specular, const vec4& light_env_chara_diffuse, - const vec4& light_env_chara_ambient, const vec4& light_env_chara_specular, - const vec4& light_env_reflect_diffuse, const vec4& light_env_reflect_ambient, - const vec4& light_env_proj_diffuse, const vec4& light_env_proj_specular, - const vec4& light_env_proj_position, const vec4& light_stage_dir, const vec4& light_stage_diff, - const vec4& light_stage_spec, const vec4& light_chara_dir, const vec4& light_chara_spec, - const vec4& light_chara_luce, const vec4& light_chara_back, const vec4& light_face_diff, - const vec4& chara_color0, const vec4& chara_color1, const vec4& chara_f_dir, const vec4& chara_f_ambient, - const vec4& chara_f_diffuse, const vec4& chara_tc_param, const mat4& normal_tangent_transforms, - const vec4& light_reflect_dir, const vec4& clip_plane, const vec4& npr_cloth_spec_color) { - render_data* data = &this->data; - mat4 temp; - mat4_transpose(&irradiance_r_transforms, &temp); - data->buffer_scene_data.g_irradiance_r_transforms[0] = temp.row0; - data->buffer_scene_data.g_irradiance_r_transforms[1] = temp.row1; - data->buffer_scene_data.g_irradiance_r_transforms[2] = temp.row2; - data->buffer_scene_data.g_irradiance_r_transforms[3] = temp.row3; - mat4_transpose(&irradiance_g_transforms, &temp); - data->buffer_scene_data.g_irradiance_g_transforms[0] = temp.row0; - data->buffer_scene_data.g_irradiance_g_transforms[1] = temp.row1; - data->buffer_scene_data.g_irradiance_g_transforms[2] = temp.row2; - data->buffer_scene_data.g_irradiance_g_transforms[3] = temp.row3; - mat4_transpose(&irradiance_b_transforms, &temp); - data->buffer_scene_data.g_irradiance_b_transforms[0] = temp.row0; - data->buffer_scene_data.g_irradiance_b_transforms[1] = temp.row1; - data->buffer_scene_data.g_irradiance_b_transforms[2] = temp.row2; - data->buffer_scene_data.g_irradiance_b_transforms[3] = temp.row3; - data->buffer_scene_data.g_light_env_stage_diffuse = light_env_stage_diffuse; - data->buffer_scene_data.g_light_env_stage_specular = light_env_stage_specular; - data->buffer_scene_data.g_light_env_chara_diffuse = light_env_chara_diffuse; - data->buffer_scene_data.g_light_env_chara_ambient = light_env_chara_ambient; - data->buffer_scene_data.g_light_env_chara_specular = light_env_chara_specular; - data->buffer_scene_data.g_light_env_reflect_diffuse = light_env_reflect_diffuse; - data->buffer_scene_data.g_light_env_reflect_ambient = light_env_reflect_ambient; - data->buffer_scene_data.g_light_env_proj_diffuse = light_env_proj_diffuse; - data->buffer_scene_data.g_light_env_proj_specular = light_env_proj_specular; - data->buffer_scene_data.g_light_env_proj_position = light_env_proj_position; - data->buffer_scene_data.g_light_stage_dir = light_stage_dir; - data->buffer_scene_data.g_light_stage_diff = light_stage_diff; - data->buffer_scene_data.g_light_stage_spec = light_stage_spec; - data->buffer_scene_data.g_light_chara_dir = light_chara_dir; - data->buffer_scene_data.g_light_chara_spec = light_chara_spec; - data->buffer_scene_data.g_light_chara_luce = light_chara_luce; - data->buffer_scene_data.g_light_chara_back = light_chara_back; - data->buffer_scene_data.g_light_face_diff = light_face_diff; - data->buffer_scene_data.g_chara_color0 = chara_color0; - data->buffer_scene_data.g_chara_color1 = chara_color1; - data->buffer_scene_data.g_chara_f_dir = chara_f_dir; - data->buffer_scene_data.g_chara_f_ambient = chara_f_ambient; - data->buffer_scene_data.g_chara_f_diffuse = chara_f_diffuse; - data->buffer_scene_data.g_chara_tc_param = chara_tc_param; - mat4_transpose(&normal_tangent_transforms, &temp); - data->buffer_scene_data.g_normal_tangent_transforms[0] = temp.row0; - data->buffer_scene_data.g_normal_tangent_transforms[1] = temp.row1; - data->buffer_scene_data.g_normal_tangent_transforms[2] = temp.row2; - data->buffer_scene_data.g_light_reflect_dir = light_reflect_dir; - data->buffer_scene_data.g_clip_plane = clip_plane; - data->buffer_scene_data.g_npr_cloth_spec_color = npr_cloth_spec_color; - enum_or(data->flags, RENDER_DATA_SCENE_UPDATE); -} - -void render_context::set_scene_light_projection(const mat4& light_projection) { - render_data* data = &this->data; - mat4 temp; - mat4_transpose(&light_projection, &temp); - data->buffer_scene_data.g_light_projection[0] = temp.row0; - data->buffer_scene_data.g_light_projection[1] = temp.row1; - data->buffer_scene_data.g_light_projection[2] = temp.row2; - data->buffer_scene_data.g_light_projection[3] = temp.row3; - enum_or(data->flags, RENDER_DATA_SCENE_UPDATE); -} - -void render_context::set_scene_projection_view(const mat4& view, const mat4& proj, const vec3& view_position) { - render_data* data = &this->data; - mat4 temp; - mat4_transpose(&view, &temp); - data->buffer_scene_data.g_view[0] = temp.row0; - data->buffer_scene_data.g_view[1] = temp.row1; - data->buffer_scene_data.g_view[2] = temp.row2; - - mat4_invert(&view, &temp); - mat4_transpose(&temp, &temp); - data->buffer_scene_data.g_view_inverse[0] = temp.row0; - data->buffer_scene_data.g_view_inverse[1] = temp.row1; - data->buffer_scene_data.g_view_inverse[2] = temp.row2; - - mat4_mul(&view, &proj, &temp); - mat4_transpose(&temp, &temp); - data->buffer_scene_data.g_projection_view[0] = temp.row0; - data->buffer_scene_data.g_projection_view[1] = temp.row1; - data->buffer_scene_data.g_projection_view[2] = temp.row2; - data->buffer_scene_data.g_projection_view[3] = temp.row3; - data->buffer_scene_data.g_view_position.x = view_position.x; - data->buffer_scene_data.g_view_position.y = view_position.y; - data->buffer_scene_data.g_view_position.z = view_position.z; - data->buffer_scene_data.g_view_position.w = 0.0f; - enum_or(data->flags, RENDER_DATA_SCENE_UPDATE); -} - -void render_context::set_scene_shadow_params(const float_t esm_param, - const mat4 mats[2], const vec4& shadow_ambient, const vec4& shadow_ambient1) { - render_data* data = &this->data; - data->buffer_scene_data.g_esm_param = { esm_param, 0.0f, 0.0f, 0.0f }; - mat4 temp; - mat4_transpose(&mats[0], &temp); - data->buffer_scene_data.g_self_shadow_receivers[0] = temp.row0; - data->buffer_scene_data.g_self_shadow_receivers[1] = temp.row1; - data->buffer_scene_data.g_self_shadow_receivers[2] = temp.row2; - mat4_transpose(&mats[1], &temp); - data->buffer_scene_data.g_self_shadow_receivers[3] = temp.row0; - data->buffer_scene_data.g_self_shadow_receivers[4] = temp.row1; - data->buffer_scene_data.g_self_shadow_receivers[5] = temp.row2; - data->buffer_scene_data.g_shadow_ambient = shadow_ambient; - data->buffer_scene_data.g_shadow_ambient1 = shadow_ambient1; - enum_or(data->flags, RENDER_DATA_SCENE_UPDATE); -} - -void render_context::set_shader(uint32_t index) { - data.set_shader(index); -} diff --git a/src/CRE/render_context.hpp b/src/CRE/render_context.hpp index 67ed19e0..c490e5b0 100644 --- a/src/CRE/render_context.hpp +++ b/src/CRE/render_context.hpp @@ -56,12 +56,21 @@ struct global_material_struct { }; struct draw_state { - draw_state_stats stats; + struct render_data { + int32_t shader_index; + bool self_shadow; + bool shadow; + bool blend; + bool cull_front; + int32_t field_8; + draw_state_stats stats; + + render_data(); + }; + draw_state_stats stats_prev; bool wireframe; bool wireframe_overlay; - bool shadow; - bool self_shadow; bool shader_debug_flag; bool use_global_material; bool fog_height; @@ -72,10 +81,12 @@ struct draw_state { global_material_struct global_material; int32_t field_68; float_t fresnel; + render_data rend_data[GL_REND_STATE_COUNT]; draw_state(); bool get_use_global_material(); + void stats_update(); void set_fog_height(bool value); void set_use_global_material(bool value); }; @@ -92,7 +103,7 @@ struct sss_data { void free(); void init(); - void set_texture(int32_t); + void set_texture(struct p_gl_rend_state& p_gl_rend_st, int32_t texture_index); }; struct light_proj { @@ -105,9 +116,9 @@ struct light_proj { ~light_proj(); void resize(int32_t width, int32_t height); - bool set(); + bool set(struct render_data_context& rend_data_ctx, cam_data& cam); - static bool set_mat(bool set_mat); + static bool set_mat(struct render_data_context& rend_data_ctx, cam_data& cam, bool set_mat); }; struct camera_blur_shader_data { @@ -206,7 +217,7 @@ struct transparency_batch_shader_data { vec4 g_opacity; }; -struct render_context; +struct render_data_context; struct render_data { struct obj_shader_data { @@ -396,7 +407,10 @@ struct render_data { }; render_data_flags flags; + cam_data cam; + mat4 inv_view_mat; int32_t shader_index; + uniform_value shader_flags; obj_shader_data buffer_shader_data; obj_scene_data buffer_scene_data; obj_batch_data buffer_batch_data; @@ -409,11 +423,12 @@ struct render_data { void init(); void free(); - void set(render_context* rctx); + void set_skinning_data(struct p_gl_rend_state& p_gl_rend_st, const mat4* mats, int32_t count); + void set_state(struct p_gl_rend_state& p_gl_rend_st); void set_shader(uint32_t index); }; -struct render_context { +struct render_data_context { struct fog_params { vec4 depth_color; vec4 height_params; @@ -424,6 +439,61 @@ struct render_context { float_t end; }; + p_gl_rend_state state; + int32_t index; + render_data& data; + uniform_value& shader_flags; + + render_data_context(int32_t index); + + void get_scene_fog_params(render_data_context::fog_params& value); + void get_scene_light(vec4* light_env_stage_diffuse, + vec4* light_env_stage_specular, vec4* light_chara_dir, vec4* light_chara_luce, + vec4* light_env_chara_diffuse, vec4* light_env_chara_specular); + void reset_shader_flags(); + void set_batch_alpha_threshold(const float_t value); + void set_batch_blend_color_offset_color(const vec4& blend_color, const vec4& offset_color); + void set_batch_material_color(const vec4& diffuse, const vec4& ambient, + const vec4& emission, const float_t material_shininess, const vec4& specular, + const vec4& fresnel_coefficients, const vec4& texture_color_coefficients, + const vec4& texture_color_offset, const vec4& texture_specular_coefficients, + const vec4& texture_specular_offset, const float_t shininess); + void set_batch_material_color_emission(const vec4& emission); + void set_batch_material_parameter(const vec4* specular, const vec4& bump_depth, + const vec4& intensity, const float_t reflect_uv_scale, const float_t refract_uv_scale); + void set_batch_min_alpha(const float_t value); + void set_batch_morph_weight(const float_t value); + void set_batch_scene_camera(const cam_data& cam); + void set_batch_sss_param(const vec4& sss_param); + void set_batch_texcoord_transforms(const mat4 mats[2]); + void set_batch_worlds(const mat4& mat); + void set_glitter_render_data_state(); + void set_render_data_state(); + void set_scene_fog_params(const render_data_context::fog_params& value); + void set_scene_framebuffer_size(const int32_t width, const int32_t height, + const int32_t render_width, const int32_t render_height); + void set_scene_light(const mat4& irradiance_r_transforms, const mat4& irradiance_g_transforms, + const mat4& irradiance_b_transforms, const vec4& light_env_stage_diffuse, + const vec4& light_env_stage_specular, const vec4& light_env_chara_diffuse, + const vec4& light_env_chara_ambient, const vec4& light_env_chara_specular, + const vec4& light_env_reflect_diffuse, const vec4& light_env_reflect_ambient, + const vec4& light_env_proj_diffuse, const vec4& light_env_proj_specular, + const vec4& light_env_proj_position, const vec4& light_stage_dir, const vec4& light_stage_diff, + const vec4& light_stage_spec, const vec4& light_chara_dir, const vec4& light_chara_spec, + const vec4& light_chara_luce, const vec4& light_chara_back, const vec4& light_face_diff, + const vec4& chara_color0, const vec4& chara_color1, const vec4& chara_f_dir, const vec4& chara_f_ambient, + const vec4& chara_f_diffuse, const vec4& chara_tc_param, const mat4& normal_tangent_transforms, + const vec4& light_reflect_dir, const vec4& clip_plane, const vec4& npr_cloth_spec_color); + void set_scene_light_projection(const mat4& light_projection); + void set_scene_shadow_params(const float_t esm_param, + const mat4 mats[2], const vec4& shadow_ambient, const vec4& shadow_ambient1); + void set_self_shadow(bool value); + void set_shader(uint32_t index); + void set_shadow(bool value); + void set_skinning_data(p_gl_rend_state& p_gl_rend_st, const mat4* mats, int32_t count); +}; + +struct render_context { struct shared_storage_buffer { void* data; size_t offset; @@ -469,11 +539,6 @@ struct render_context { bool chara_reflect; bool chara_refract; - mat4 view_mat; - mat4 proj_mat; - mat4 vp_mat; - vec4 g_near_far; - mat4 matrix_buffer[MATRIX_BUFFER_COUNT]; GLuint box_vao; @@ -507,7 +572,7 @@ struct render_context { GL::UniformBuffer tone_map_ubo; GL::UniformBuffer transparency_batch_ubo; - render_data data; + render_data data[GL_REND_STATE_COUNT]; texture* empty_texture_2d; texture* empty_texture_cube_map; @@ -544,50 +609,8 @@ struct render_context { void add_shared_storage_uniform_buffer_data(size_t index, const void* data, size_t size, size_t max_size, bool storage = false); - void get_scene_fog_params(render_context::fog_params& value); - void get_scene_light(vec4* light_env_stage_diffuse, - vec4* light_env_stage_specular, vec4* light_chara_dir, vec4* light_chara_luce, - vec4* light_env_chara_diffuse, vec4* light_env_chara_specular); bool get_shared_storage_uniform_buffer_data(size_t index, GLuint& buffer, size_t& offset, size_t& size, bool storage = false); void post_proc(); void pre_proc(); - void set_batch_alpha_threshold(const float_t value); - void set_batch_blend_color_offset_color(const vec4& blend_color, const vec4& offset_color); - void set_batch_joint(const mat4& mat); - void set_batch_material_color(const vec4& diffuse, const vec4& ambient, - const vec4& emission, const float_t material_shininess, const vec4& specular, - const vec4& fresnel_coefficients, const vec4& texture_color_coefficients, - const vec4& texture_color_offset, const vec4& texture_specular_coefficients, - const vec4& texture_specular_offset, const float_t shininess); - void set_batch_material_color_emission(const vec4& emission); - void set_batch_material_parameter(const vec4* specular, const vec4& bump_depth, - const vec4& intensity, const float_t reflect_uv_scale, const float_t refract_uv_scale); - void set_batch_min_alpha(const float_t value); - void set_batch_morph_weight(const float_t value); - void set_batch_sss_param(const vec4& sss_param); - void set_batch_texcoord_transforms(const mat4 mats[2]); - void set_batch_worlds(const mat4& mat); - void set_glitter_render_data(); - void set_render_data(); - void set_scene_fog_params(const render_context::fog_params& value); - void set_scene_framebuffer_size(const int32_t width, const int32_t height, - const int32_t render_width, const int32_t render_height); - void set_scene_light(const mat4& irradiance_r_transforms, const mat4& irradiance_g_transforms, - const mat4& irradiance_b_transforms, const vec4& light_env_stage_diffuse, - const vec4& light_env_stage_specular, const vec4& light_env_chara_diffuse, - const vec4& light_env_chara_ambient, const vec4& light_env_chara_specular, - const vec4& light_env_reflect_diffuse, const vec4& light_env_reflect_ambient, - const vec4& light_env_proj_diffuse, const vec4& light_env_proj_specular, - const vec4& light_env_proj_position, const vec4& light_stage_dir, const vec4& light_stage_diff, - const vec4& light_stage_spec, const vec4& light_chara_dir, const vec4& light_chara_spec, - const vec4& light_chara_luce, const vec4& light_chara_back, const vec4& light_face_diff, - const vec4& chara_color0, const vec4& chara_color1, const vec4& chara_f_dir, const vec4& chara_f_ambient, - const vec4& chara_f_diffuse, const vec4& chara_tc_param, const mat4& normal_tangent_transforms, - const vec4& light_reflect_dir, const vec4& clip_plane, const vec4& npr_cloth_spec_color); - void set_scene_light_projection(const mat4& light_projection); - void set_scene_projection_view(const mat4& view, const mat4& proj, const vec3& view_position); - void set_scene_shadow_params(const float_t esm_param, - const mat4 mats[2], const vec4& shadow_ambient, const vec4& shadow_ambient1); - void set_shader(uint32_t index); }; diff --git a/src/CRE/render_manager.cpp b/src/CRE/render_manager.cpp index c1938c55..ab3a73a2 100644 --- a/src/CRE/render_manager.cpp +++ b/src/CRE/render_manager.cpp @@ -14,7 +14,7 @@ #include "config.hpp" #include "clear_color.hpp" #include "effect.hpp" -#include "gl_rend_state.hpp" +#include "gl_state.hpp" #include "light_param.hpp" #include "render.hpp" #include "render_context.hpp" @@ -29,33 +29,37 @@ extern render_context* rctx_ptr; bool reflect_draw = false; mat4 reflect_mat = mat4_identity; -static void draw_pass_shadow_begin_make_shadowmap(Shadow* shad, int32_t index, int32_t a3); -static void draw_pass_shadow_end_make_shadowmap(Shadow* shad, int32_t index, int32_t a3); -static void draw_pass_shadow_filter(RenderTexture* a1, RenderTexture* a2, - RenderTexture* a3, float_t sigma, float_t far_texel_offset, bool enable_lit_proj); -static void draw_pass_shadow_esm_filter(RenderTexture* dst, RenderTexture* buf, RenderTexture* src); -static bool draw_pass_shadow_litproj(light_proj* litproj); -static void draw_pass_sss_contour(render_context* rctx, rndr::Render* rend); -static void draw_pass_sss_filter(render_context* rctx, sss_data* sss); +static void draw_pass_shadow_begin_make_shadowmap(Shadow* shad, + render_data_context& rend_data_ctx, cam_data& cam, int32_t index, int32_t a3); +static void draw_pass_shadow_end_make_shadowmap(Shadow* shad, + render_data_context& rend_data_ctx, int32_t index, int32_t a3); +static void draw_pass_shadow_filter(render_data_context& rend_data_ctx, + RenderTexture* a1, RenderTexture* a2, RenderTexture* a3, + float_t sigma, float_t far_texel_offset, bool enable_lit_proj); +static void draw_pass_shadow_esm_filter(render_data_context& rend_data_ctx, + RenderTexture* dst, RenderTexture* buf, RenderTexture* src); +static bool draw_pass_shadow_litproj(render_data_context& rend_data_ctx, light_proj* litproj, cam_data& cam); +static void draw_pass_sss_contour(render_data_context& rend_data_ctx, render_context* rctx, rndr::Render* rend); +static void draw_pass_sss_filter(render_data_context& rend_data_ctx, render_context* rctx, sss_data* sss); static int32_t draw_pass_3d_get_translucent_count(render_context* rctx); -static void draw_pass_3d_shadow_reset(render_context* rctx); -static void draw_pass_3d_shadow_set(Shadow* shad, render_context* rctx); -extern void draw_pass_3d_translucent(render_context* rctx, mdl::ObjType opaque, - mdl::ObjType transparent, mdl::ObjType translucent); +static void draw_pass_3d_shadow_reset(render_data_context& rend_data_ctx, render_context* rctx); +static void draw_pass_3d_shadow_set(render_data_context& rend_data_ctx, Shadow* shad, render_context* rctx); +extern void draw_pass_3d_translucent(render_data_context& rend_data_ctx, + render_context* rctx, mdl::ObjType opaque, mdl::ObjType transparent, mdl::ObjType translucent, cam_data& cam); static int32_t draw_pass_3d_translucent_count_layers(render_context* rctx, - int32_t* alpha_array, mdl::ObjType opaque, - mdl::ObjType transparent, mdl::ObjType translucent); -static void draw_pass_3d_translucent_has_objects(render_context* rctx, bool* arr, mdl::ObjType type); + int32_t* alpha_array, mdl::ObjType opaque, mdl::ObjType transparent, mdl::ObjType translucent, cam_data& cam); +static void draw_pass_3d_translucent_has_objects(render_context* rctx, bool* arr, mdl::ObjType type, cam_data& cam); -static void draw_pass_reflect_full(rndr::RenderManager* render_manager); +static void draw_pass_reflect_full(render_data_context& rend_data_ctx, rndr::RenderManager* render_manager); -static void blur_filter_apply(render_context* rctx, RenderTexture* dst, RenderTexture* src, +static void blur_filter_apply(render_data_context& rend_data_ctx, + render_context* rctx, RenderTexture* dst, RenderTexture* src, blur_filter_mode filter, const vec2 res_scale, const vec4 scale, const vec4 offset); static void render_manager_free_render_textures(); static void render_manager_init_render_textures(int32_t multisample); -static void set_reflect_mat(render_context* rctx); +static void set_reflect_mat(render_data_context& rend_data_ctx, cam_data& cam); namespace rndr { struct RenderTextureData { @@ -283,69 +287,89 @@ namespace rndr { } void RenderManager::render_all() { - light_param_data_storage_data_set_ibl(); sprite_manager_pre_draw(); static const vec4 color_clear = 0.0f; - gl_rend_state.bind_framebuffer(0); - glClearBufferfv(GL_COLOR, 0, (float_t*)&color_clear); + { + render_data_context rend_data_ctx(0); - rctx_ptr->set_scene_framebuffer_size(render->render_width[0], - render->render_height[0], render->render_width[0], render->render_height[0]); + rend_data_ctx.state.get(); + rend_data_ctx.state.bind_framebuffer(0); + glClearBufferfv(GL_COLOR, 0, (float_t*)&color_clear); - gl_rend_state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - gl_rend_state.enable_depth_test(); - gl_rend_state.set_depth_func(GL_LEQUAL); - gl_rend_state.set_depth_mask(GL_TRUE); + rend_data_ctx.set_scene_framebuffer_size(render->render_width[0], + render->render_height[0], render->render_width[0], render->render_height[0]); - gl_rend_state.begin_event("rndpass_render_all_pass::Caller::execute_pre3d"); - for (int32_t i = RND_PASSID_SHADOW; i <= RND_PASSID_CLEAR; i++) - RenderManager::render_single_pass((RenderPassID)i); - gl_rend_state.end_event(); + rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + rend_data_ctx.state.enable_depth_test(); + rend_data_ctx.state.set_depth_func(GL_LEQUAL); + rend_data_ctx.state.set_depth_mask(GL_TRUE); + } - gl_rend_state.begin_event("rndpass_render_all_pass::Caller::execute_3d"); - for (int32_t i = RND_PASSID_PRE_SPRITE; i <= RND_PASSID_3D; i++) - RenderManager::render_single_pass((RenderPassID)i); - gl_rend_state.end_event(); + { + render_data_context rend_data_ctx(0); + rend_data_ctx.state.get(); + rend_data_ctx.state.begin_event("rndpass_render_all_pass::Caller::execute_pre3d"); + for (int32_t i = RND_PASSID_SHADOW; i <= RND_PASSID_CLEAR; i++) + RenderManager::render_single_pass(rend_data_ctx, (RenderPassID)i); + rend_data_ctx.state.end_event(); + } - gl_rend_state.begin_event("rndpass_render_all_pass::Caller::execute_2d"); - for (int32_t i = RND_PASSID_SHOW_VECTOR; i <= RND_PASSID_12; i++) - RenderManager::render_single_pass((RenderPassID)i); - gl_rend_state.end_event(); + { + render_data_context rend_data_ctx(1); + rend_data_ctx.state.get(); + rend_data_ctx.state.begin_event("rndpass_render_all_pass::Caller::execute_3d"); + for (int32_t i = RND_PASSID_PRE_SPRITE; i <= RND_PASSID_3D; i++) + RenderManager::render_single_pass(rend_data_ctx, (RenderPassID)i); + rend_data_ctx.state.end_event(); + } + + { + render_data_context rend_data_ctx(2); + rend_data_ctx.state.get(); + rend_data_ctx.state.begin_event("rndpass_render_all_pass::Caller::execute_2d"); + for (int32_t i = RND_PASSID_SHOW_VECTOR; i <= RND_PASSID_12; i++) + RenderManager::render_single_pass(rend_data_ctx, (RenderPassID)i); + rend_data_ctx.state.end_event(); + } rctx_ptr->disp_manager->check_vertex_arrays(); sprite_manager_post_draw(); - gl_rend_state.bind_vertex_array(0); - gl_rend_state.disable_primitive_restart(); - gl_rend_state.bind_uniform_buffer(0); - gl_rend_state.bind_uniform_buffer_base(0, 0); - gl_rend_state.bind_uniform_buffer_base(1, 0); - gl_rend_state.bind_uniform_buffer_base(2, 0); - gl_rend_state.bind_uniform_buffer_base(3, 0); - gl_rend_state.bind_uniform_buffer_base(4, 0); - gl_rend_state.bind_shader_storage_buffer(0); - gl_rend_state.bind_shader_storage_buffer_base(0, 0); + render_data_context rend_data_ctx(3); + rend_data_ctx.state.get(); + rend_data_ctx.state.bind_vertex_array(0); + rend_data_ctx.state.disable_primitive_restart(); + rend_data_ctx.state.bind_uniform_buffer(0); + rend_data_ctx.state.bind_uniform_buffer_base(0, 0); + rend_data_ctx.state.bind_uniform_buffer_base(1, 0); + rend_data_ctx.state.bind_uniform_buffer_base(2, 0); + rend_data_ctx.state.bind_uniform_buffer_base(3, 0); + rend_data_ctx.state.bind_uniform_buffer_base(4, 0); + rend_data_ctx.state.bind_shader_storage_buffer(0); + rend_data_ctx.state.bind_shader_storage_buffer_base(0, 0); } void RenderManager::rndpass_post_proc() { - gl_rend_state.begin_event("rndpass_post_proc"); + render_data_context rend_data_ctx(3); + rend_data_ctx.state.begin_event("rndpass_post_proc"); rctx_ptr->post_proc(); render->post_proc(); field_31C = false; - gl_rend_state.end_event(); + rend_data_ctx.state.end_event(); } - void RenderManager::rndpass_pre_proc(struct camera* cam) { - gl_rend_state.begin_event("rndpass_pre_proc"); - render->pre_proc(cam); + void RenderManager::rndpass_pre_proc() { + render_data_context rend_data_ctx(0); + rend_data_ctx.state.begin_event("rndpass_pre_proc"); + render->pre_proc(rend_data_ctx); Glitter::glt_particle_manager->CalcDisp(); rctx_ptr->pre_proc(); - gl_rend_state.end_event(); + rend_data_ctx.state.end_event(); } - void RenderManager::render_single_pass(RenderPassID id) { + void RenderManager::render_single_pass(render_data_context& rend_data_ctx, RenderPassID id) { cpu_time[id] = 0.0; gpu_time[id] = 0.0; if (!pass_sw[id]) { @@ -356,37 +380,37 @@ namespace rndr { render_pass_begin(); switch (id) { case RND_PASSID_SHADOW: - pass_shadow(); + pass_shadow(rend_data_ctx); break; case RND_PASSID_SS_SSS: - pass_ss_sss(); + pass_ss_sss(rend_data_ctx); break; case RND_PASSID_REFLECT: - pass_reflect(); + pass_reflect(rend_data_ctx); break; case RND_PASSID_REFRACT: - pass_refract(); + pass_refract(rend_data_ctx); break; case RND_PASSID_PRE_PROCESS: - pass_pre_process(); + pass_pre_process(rend_data_ctx); break; case RND_PASSID_CLEAR: - pass_clear(); + pass_clear(rend_data_ctx); break; case RND_PASSID_PRE_SPRITE: - pass_pre_sprite(); + pass_pre_sprite(rend_data_ctx); break; case RND_PASSID_3D: - pass_3d(); + pass_3d(rend_data_ctx); break; case RND_PASSID_SHOW_VECTOR: - pass_show_vector(); + pass_show_vector(rend_data_ctx); break; case RND_PASSID_POST_PROCESS: - pass_post_process(); + pass_post_process(rend_data_ctx); break; case RND_PASSID_SPRITE: - pass_sprite(); + pass_sprite(rend_data_ctx); break; } render_pass_end(id); @@ -410,38 +434,39 @@ namespace rndr { gpu_time[id] = 0; } - void RenderManager::pass_shadow() { + void RenderManager::pass_shadow(render_data_context& rend_data_ctx) { render_context* rctx = rctx_ptr; - gl_rend_state.begin_event("pass_shadow"); - gl_rend_state.begin_event("texproj"); - if (rctx->litproj->set()) { - rctx->disp_manager->draw(mdl::OBJ_TYPE_OPAQUE); - rctx->disp_manager->draw(mdl::OBJ_TYPE_TRANSPARENT); - rctx->disp_manager->draw(mdl::OBJ_TYPE_TRANSLUCENT); + rend_data_ctx.state.begin_event("pass_shadow"); + rend_data_ctx.state.begin_event("texproj"); + cam_data texproj_cam; + if (rctx->litproj->set(rend_data_ctx, texproj_cam)) { + rend_data_ctx.set_batch_scene_camera(texproj_cam); + rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_OPAQUE, texproj_cam); + rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_TRANSPARENT, texproj_cam); + rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_TRANSLUCENT, texproj_cam); - rctx->draw_state->shader_index = -1; - uniform_value[U_DEPTH] = 0; - draw_pass_shadow_filter(&rctx->litproj->shadow_texture[0], + rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = -1; + rend_data_ctx.shader_flags.arr[U_DEPTH] = 0; + draw_pass_shadow_filter(rend_data_ctx, &rctx->litproj->shadow_texture[0], &rctx->litproj->shadow_texture[1], 0, 1.5f, 0.01f, true); - if (draw_pass_shadow_litproj(rctx->litproj)) { - draw_pass_set_camera(); - + if (draw_pass_shadow_litproj(rend_data_ctx, rctx->litproj, texproj_cam)) { for (int32_t i = LIGHT_SET_MAIN; i < LIGHT_SET_MAX; i++) - rctx->light_set[i].data_set(rctx->face, (light_set_id)i); + rctx->light_set[i].data_set(rend_data_ctx, rctx->face, (light_set_id)i); - rctx->disp_manager->draw(mdl::OBJ_TYPE_OPAQUE); - rctx->disp_manager->draw(mdl::OBJ_TYPE_TRANSPARENT); - rctx->disp_manager->obj_sort(&rctx->view_mat, mdl::OBJ_TYPE_TRANSLUCENT, 1); - gl_rend_state.set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - gl_rend_state.enable_blend(); - rctx->disp_manager->draw(mdl::OBJ_TYPE_TRANSLUCENT); - gl_rend_state.disable_blend(); - rctx->draw_state->shader_index = -1; - gl_rend_state.bind_framebuffer(0); + rend_data_ctx.set_batch_scene_camera(cam); + rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_OPAQUE, cam); + rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_TRANSPARENT, cam); + rctx->disp_manager->obj_sort(rend_data_ctx, mdl::OBJ_TYPE_TRANSLUCENT, 1, cam); + rend_data_ctx.state.set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + rend_data_ctx.state.enable_blend(); + rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_TRANSLUCENT, cam); + rend_data_ctx.state.disable_blend(); + rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = -1; + rend_data_ctx.state.bind_framebuffer(0); } } - gl_rend_state.end_event(); + rend_data_ctx.state.end_event(); bool v3 = false; int32_t v10[2]; @@ -460,19 +485,22 @@ namespace rndr { shad->curr_render_textures[1] = &shad->render_textures[1]; shad->curr_render_textures[2] = &shad->render_textures[2]; + cam_data cam; for (int32_t i = 0, j = 0; i < 2; i++) { if (!v10[i]) continue; - draw_pass_shadow_begin_make_shadowmap(shad, v11[i], j); - rctx->disp_manager->draw((mdl::ObjType)(mdl::OBJ_TYPE_SHADOW_CHARA + v11[i])); + draw_pass_shadow_begin_make_shadowmap(shad, rend_data_ctx, cam, v11[i], j); + rend_data_ctx.set_batch_scene_camera(cam); + rctx->disp_manager->draw(rend_data_ctx, (mdl::ObjType)(mdl::OBJ_TYPE_SHADOW_CHARA + v11[i]), cam); if (rctx->disp_manager->get_obj_count((mdl::ObjType)(mdl::OBJ_TYPE_SHADOW_OBJECT_CHARA + v11[i])) > 0) { - gl_rend_state.set_color_mask(show_stage_shadow + rend_data_ctx.state.set_color_mask(show_stage_shadow ? GL_TRUE : GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); - rctx->disp_manager->draw((mdl::ObjType)(mdl::OBJ_TYPE_SHADOW_OBJECT_CHARA + i)); - gl_rend_state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + rctx->disp_manager->draw(rend_data_ctx, + (mdl::ObjType)(mdl::OBJ_TYPE_SHADOW_OBJECT_CHARA + i), cam); + rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); } - draw_pass_shadow_end_make_shadowmap(shad, v11[i], j); + draw_pass_shadow_end_make_shadowmap(shad, rend_data_ctx, v11[i], j); j++; } } @@ -480,25 +508,25 @@ namespace rndr { shad->curr_render_textures[0] = &shad->render_textures[0]; shad->curr_render_textures[1] = &shad->render_textures[1]; shad->curr_render_textures[2] = &shad->render_textures[2]; - shad->clear_textures(); + shad->clear_textures(rend_data_ctx.state); } - shader::unbind(); - gl_rend_state.bind_framebuffer(0); - gl_rend_state.end_event(); + shader::unbind(rend_data_ctx.state); + rend_data_ctx.state.bind_framebuffer(0); + rend_data_ctx.state.end_event(); } - void RenderManager::pass_ss_sss() { + void RenderManager::pass_ss_sss(render_data_context& rend_data_ctx) { render_context* rctx = rctx_ptr; ::sss_data* sss = rctx->sss_data; if (!sss->init_data || !sss->enable) return; - gl_rend_state.begin_event("pass_ss_sss"); + rend_data_ctx.state.begin_event("pass_ss_sss"); rndr::Render* rend = render; extern bool reflect_full; if ((reflect_full || sv_better_reflect && reflect_type == STAGE_DATA_REFLECT_REFLECT_MAP) && pass_sw[rndr::RND_PASSID_REFLECT] && rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_SSS)) { - gl_rend_state.begin_event("reflect"); + rend_data_ctx.state.begin_event("reflect"); reflect_draw = true; rndr::Render* rend = render; @@ -507,200 +535,202 @@ namespace rndr { // sss->npr_contour = false; //if (sss->npr_contour) { - refl_tex.Bind(); - refl_tex.SetViewport(); + refl_tex.Bind(rend_data_ctx.state); + refl_tex.SetViewport(rend_data_ctx.state); //} //else { - // sss->textures[0].Bind(); - // gl_rend_state.set_viewport(0, 0, 640, 360); + // sss->textures[0].Bind(rend_data_ctx.state); + // rend_data_ctx.state.set_viewport(0, 0, 640, 360); //} glClearColor(sss->param.x, sss->param.y, sss->param.z, 0.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - draw_pass_set_camera(); for (int32_t i = LIGHT_SET_MAIN; i < LIGHT_SET_MAX; i++) - rctx->light_set[i].data_set(rctx->face, (light_set_id)i); + rctx->light_set[i].data_set(rend_data_ctx, rctx->face, (light_set_id)i); if (shadow) - draw_pass_3d_shadow_set(shadow_ptr, rctx); + draw_pass_3d_shadow_set(rend_data_ctx, shadow_ptr, rctx); else - draw_pass_3d_shadow_reset(rctx); + draw_pass_3d_shadow_reset(rend_data_ctx, rctx); - set_reflect_mat(rctx); + cam_data reflect_cam = cam; + set_reflect_mat(rend_data_ctx, reflect_cam); + rend_data_ctx.set_batch_scene_camera(reflect_cam); - rctx->draw_state->shader_index = SHADER_FT_SSS_SKIN; - gl_rend_state.enable_depth_test(); - gl_rend_state.set_depth_func(GL_LEQUAL); - gl_rend_state.set_depth_mask(GL_TRUE); - rctx->disp_manager->draw(mdl::OBJ_TYPE_SSS); - gl_rend_state.disable_depth_test(); - rctx->draw_state->shader_index = -1; - draw_pass_3d_shadow_reset(rctx); - uniform_value[U_NPR] = 0; + rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = SHADER_FT_SSS_SKIN; + rend_data_ctx.state.enable_depth_test(); + rend_data_ctx.state.set_depth_func(GL_LEQUAL); + rend_data_ctx.state.set_depth_mask(GL_TRUE); + rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_SSS, reflect_cam); + rend_data_ctx.state.disable_depth_test(); + rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = -1; + draw_pass_3d_shadow_reset(rend_data_ctx, rctx); + rend_data_ctx.shader_flags.arr[U_NPR] = 0; if (npr_param == 1) { if (sss->enable && sss->npr_contour) { - uniform_value[U_NPR] = 1; - draw_pass_sss_contour(rctx, rend); + rend_data_ctx.shader_flags.arr[U_NPR] = 1; + draw_pass_sss_contour(rend_data_ctx, rctx, rend); } else if (npr) { - refl_tex.Bind(); - refl_tex.SetViewport(); + refl_tex.Bind(rend_data_ctx.state); + refl_tex.SetViewport(rend_data_ctx.state); glClear(GL_DEPTH_BUFFER_BIT); - rctx->draw_state->shader_index = SHADER_FT_SSS_SKIN; - gl_rend_state.enable_depth_test(); - gl_rend_state.set_depth_mask(GL_TRUE); - rctx->disp_manager->draw(mdl::OBJ_TYPE_SSS); - gl_rend_state.disable_depth_test(); - rctx->draw_state->shader_index = -1; - gl_rend_state.bind_framebuffer(0); - uniform_value[U_NPR] = 1; - draw_pass_sss_contour(rctx, rend); + rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = SHADER_FT_SSS_SKIN; + rend_data_ctx.state.enable_depth_test(); + rend_data_ctx.state.set_depth_mask(GL_TRUE); + rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_SSS, reflect_cam); + rend_data_ctx.state.disable_depth_test(); + rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = -1; + rend_data_ctx.state.bind_framebuffer(0); + rend_data_ctx.shader_flags.arr[U_NPR] = 1; + draw_pass_sss_contour(rend_data_ctx, rctx, rend); } } if (!sss->npr_contour) { - sss->textures[0].Bind(); - gl_rend_state.set_viewport(0, 0, 640, 360); + sss->textures[0].Bind(rend_data_ctx.state); + rend_data_ctx.state.set_viewport(0, 0, 640, 360); filter_scene_shader_data filter_scene = {}; filter_scene.g_transform = { 1.0f, 1.0f, 0.0f, 0.0f }; filter_scene.g_texcoord = { 1.0f, 1.0f, 0.0f, 0.0f }; - rctx->filter_scene_ubo.WriteMemory(filter_scene); + rctx->filter_scene_ubo.WriteMemory(rend_data_ctx.state, filter_scene); imgfilter_batch_shader_data imgfilter_batch = {}; imgfilter_batch.g_color_scale = 1.0f; imgfilter_batch.g_color_offset = 0.0f; imgfilter_batch.g_texture_lod = 0.0f; - rctx->imgfilter_batch_ubo.WriteMemory(imgfilter_batch); + rctx->imgfilter_batch_ubo.WriteMemory(rend_data_ctx.state, imgfilter_batch); - uniform_value[U_IMAGE_FILTER] = 5; - shaders_ft.set(SHADER_FT_IMGFILT); - rctx->filter_scene_ubo.Bind(0); - rctx->imgfilter_batch_ubo.Bind(1); - gl_rend_state.active_bind_texture_2d(0, refl_tex.GetColorTex()); - gl_rend_state.bind_sampler(0, rctx->render_samplers[0]); - gl_rend_state.bind_vertex_array(rctx->common_vao); - shaders_ft.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); + rend_data_ctx.shader_flags.arr[U_IMAGE_FILTER] = 5; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_IMGFILT); + rend_data_ctx.state.bind_uniform_buffer_base(0, rctx->filter_scene_ubo); + rend_data_ctx.state.bind_uniform_buffer_base(1, rctx->imgfilter_batch_ubo); + rend_data_ctx.state.active_bind_texture_2d(0, refl_tex.GetColorTex()); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); + rend_data_ctx.state.bind_vertex_array(rctx->common_vao); + rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); } - draw_pass_sss_filter(rctx, sss); + draw_pass_sss_filter(rend_data_ctx, rctx, sss); reflect_draw = false; - gl_rend_state.end_event(); + rend_data_ctx.state.end_event(); } //if (rend->render_width > 1280.0) // sss->npr_contour = false; //if (sss->npr_contour) { - rend->rend_texture[0].Bind(); - rend->rend_texture[0].SetViewport(); + rend->rend_texture[0].Bind(rend_data_ctx.state); + rend_data_ctx.state.set_viewport(0, 0, + rend->rend_texture[0].GetWidth(), rend->rend_texture[0].GetHeight()); //} //else { - // sss->textures[0].Bind(); - // gl_rend_state.set_viewport(0, 0, 640, 360); + // sss->textures[0].Bind(rend_data_ctx.state); + // rend_data_ctx.state.set_viewport(0, 0, 640, 360); //} glClearColor(sss->param.x, sss->param.y, sss->param.z, 0.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - draw_pass_set_camera(); for (int32_t i = LIGHT_SET_MAIN; i < LIGHT_SET_MAX; i++) - rctx->light_set[i].data_set(rctx->face, (light_set_id)i); + rctx->light_set[i].data_set(rend_data_ctx, rctx->face, (light_set_id)i); if (shadow) - draw_pass_3d_shadow_set(shadow_ptr, rctx); + draw_pass_3d_shadow_set(rend_data_ctx, shadow_ptr, rctx); else - draw_pass_3d_shadow_reset(rctx); + draw_pass_3d_shadow_reset(rend_data_ctx, rctx); - rctx->draw_state->shader_index = SHADER_FT_SSS_SKIN; - gl_rend_state.enable_depth_test(); - gl_rend_state.set_depth_func(GL_LEQUAL); - gl_rend_state.set_depth_mask(GL_TRUE); - rctx->disp_manager->draw(mdl::OBJ_TYPE_SSS); - gl_rend_state.disable_depth_test(); - rctx->draw_state->shader_index = -1; - draw_pass_3d_shadow_reset(rctx); - uniform_value[U_NPR] = 0; + rend_data_ctx.set_batch_scene_camera(cam); + + rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = SHADER_FT_SSS_SKIN; + rend_data_ctx.state.enable_depth_test(); + rend_data_ctx.state.set_depth_func(GL_LEQUAL); + rend_data_ctx.state.set_depth_mask(GL_TRUE); + rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_SSS, cam); + rend_data_ctx.state.disable_depth_test(); + rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = -1; + draw_pass_3d_shadow_reset(rend_data_ctx, rctx); + rend_data_ctx.shader_flags.arr[U_NPR] = 0; if (npr_param == 1) { if (sss->enable && sss->npr_contour) { - uniform_value[U_NPR] = 1; - draw_pass_sss_contour(rctx, rend); + rend_data_ctx.shader_flags.arr[U_NPR] = 1; + draw_pass_sss_contour(rend_data_ctx, rctx, rend); } else if (npr) { - rend->rend_texture[0].Bind(); - rend->rend_texture[0].SetViewport(); + rend->rend_texture[0].Bind(rend_data_ctx.state); + rend->rend_texture[0].SetViewport(rend_data_ctx.state); glClear(GL_DEPTH_BUFFER_BIT); - rctx->draw_state->shader_index = SHADER_FT_SSS_SKIN; - gl_rend_state.enable_depth_test(); - gl_rend_state.set_depth_mask(GL_TRUE); - rctx->disp_manager->draw(mdl::OBJ_TYPE_SSS); - gl_rend_state.disable_depth_test(); - rctx->draw_state->shader_index = -1; - gl_rend_state.bind_framebuffer(0); - uniform_value[U_NPR] = 1; - draw_pass_sss_contour(rctx, rend); + rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = SHADER_FT_SSS_SKIN; + rend_data_ctx.state.enable_depth_test(); + rend_data_ctx.state.set_depth_mask(GL_TRUE); + rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_SSS, cam); + rend_data_ctx.state.disable_depth_test(); + rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = -1; + rend_data_ctx.state.bind_framebuffer(0); + rend_data_ctx.shader_flags.arr[U_NPR] = 1; + draw_pass_sss_contour(rend_data_ctx, rctx, rend); } } if (!sss->npr_contour) { - sss->textures[0].Bind(); - gl_rend_state.set_viewport(0, 0, 640, 360); + sss->textures[0].Bind(rend_data_ctx.state); + rend_data_ctx.state.set_viewport(0, 0, 640, 360); filter_scene_shader_data filter_scene = {}; filter_scene.g_transform = { 1.0f, 1.0f, 0.0f, 0.0f }; filter_scene.g_texcoord = { 1.0f, 1.0f, 0.0f, 0.0f }; - rctx->filter_scene_ubo.WriteMemory(filter_scene); + rctx->filter_scene_ubo.WriteMemory(rend_data_ctx.state, filter_scene); imgfilter_batch_shader_data imgfilter_batch = {}; imgfilter_batch.g_color_scale = 1.0f; imgfilter_batch.g_color_offset = 0.0f; imgfilter_batch.g_texture_lod = 0.0f; - rctx->imgfilter_batch_ubo.WriteMemory(imgfilter_batch); + rctx->imgfilter_batch_ubo.WriteMemory(rend_data_ctx.state, imgfilter_batch); - uniform_value[U_IMAGE_FILTER] = 5; - shaders_ft.set(SHADER_FT_IMGFILT); - rctx->filter_scene_ubo.Bind(0); - rctx->imgfilter_batch_ubo.Bind(1); - gl_rend_state.active_bind_texture_2d(0, rend->rend_texture[0].GetColorTex()); - gl_rend_state.bind_sampler(0, rctx->render_samplers[0]); - gl_rend_state.bind_vertex_array(rctx->common_vao); - shaders_ft.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); + rend_data_ctx.shader_flags.arr[U_IMAGE_FILTER] = 5; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_IMGFILT); + rend_data_ctx.state.bind_uniform_buffer_base(0, rctx->filter_scene_ubo); + rend_data_ctx.state.bind_uniform_buffer_base(1, rctx->imgfilter_batch_ubo); + rend_data_ctx.state.active_bind_texture_2d(0, rend->rend_texture[0].GetColorTex()); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); + rend_data_ctx.state.bind_vertex_array(rctx->common_vao); + rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); } - draw_pass_sss_filter(rctx, sss); - gl_rend_state.bind_framebuffer(0); - gl_rend_state.end_event(); + draw_pass_sss_filter(rend_data_ctx, rctx, sss); + rend_data_ctx.state.bind_framebuffer(0); + rend_data_ctx.state.end_event(); } - void RenderManager::pass_reflect() { + void RenderManager::pass_reflect(render_data_context& rend_data_ctx) { extern bool reflect_full; if (reflect_full) { - draw_pass_reflect_full(this); + draw_pass_reflect_full(rend_data_ctx, this); return; } render_context* rctx = rctx_ptr; - gl_rend_state.begin_event("pass_reflect"); + rend_data_ctx.state.begin_event("pass_reflect"); RenderTexture& refl_tex = rctx->render_manager->get_render_texture(0); RenderTexture& refl_buf_tex = rctx->reflect_buffer; - refl_tex.Bind(); + refl_tex.Bind(rend_data_ctx.state); if (rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFLECT_OPAQUE) || rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFLECT_TRANSPARENT) || rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFLECT_TRANSLUCENT) || rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFLECT_CHARA_OPAQUE) || rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFLECT_CHARA_TRANSPARENT) || rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFLECT_CHARA_TRANSLUCENT)) { - refl_tex.SetViewport(); - - draw_pass_set_camera(); + refl_tex.SetViewport(rend_data_ctx.state); + rend_data_ctx.set_batch_scene_camera(cam); for (int32_t i = LIGHT_SET_MAIN; i < LIGHT_SET_MAX; i++) - rctx->light_set[i].data_set(rctx->face, (light_set_id)i); + rctx->light_set[i].data_set(rend_data_ctx, rctx->face, (light_set_id)i); for (int32_t i = FOG_DEPTH; i < FOG_BUMP; i++) - rctx->fog[i].data_set((fog_id)i); + rctx->fog[i].data_set(rend_data_ctx, (fog_id)i); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); if (sv_better_reflect && rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_SSS)) @@ -708,98 +738,100 @@ namespace rndr { else glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - rctx->draw_state->shader_index = SHADER_FT_S_REFL; + rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = SHADER_FT_S_REFL; light_set* set = &rctx->light_set[LIGHT_SET_MAIN]; light_clip_plane clip_plane; set->lights[LIGHT_SPOT].get_clip_plane(clip_plane); - uniform_value[U_REFLECT] = 2; - uniform_value[U_CLIP_PLANE] = clip_plane.data[1] ? 1 : 0; + rend_data_ctx.shader_flags.arr[U_REFLECT] = 2; + rend_data_ctx.shader_flags.arr[U_CLIP_PLANE] = clip_plane.data[1] ? 1 : 0; - gl_rend_state.enable_depth_test(); - gl_rend_state.set_depth_func(GL_LEQUAL); - gl_rend_state.set_depth_mask(GL_TRUE); - rctx->disp_manager->draw(mdl::OBJ_TYPE_REFLECT_OPAQUE, 0, reflect_texture_mask); + rend_data_ctx.state.enable_depth_test(); + rend_data_ctx.state.set_depth_func(GL_LEQUAL); + rend_data_ctx.state.set_depth_mask(GL_TRUE); + rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_REFLECT_OPAQUE, cam, 0, reflect_texture_mask); if (reflect_type == STAGE_DATA_REFLECT_REFLECT_MAP) { - gl_rend_state.enable_blend(); - gl_rend_state.set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - gl_rend_state.set_blend_equation(GL_FUNC_ADD); - rctx->disp_manager->draw(mdl::OBJ_TYPE_REFLECT_TRANSLUCENT); - gl_rend_state.disable_blend(); + rend_data_ctx.state.enable_blend(); + rend_data_ctx.state.set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + rend_data_ctx.state.set_blend_equation(GL_FUNC_ADD); + rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_REFLECT_TRANSLUCENT, cam); + rend_data_ctx.state.disable_blend(); } if (sv_better_reflect && reflect_type == STAGE_DATA_REFLECT_REFLECT_MAP) { reflect_draw = true; - rctx->draw_state->shader_index = -1; + rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = -1; int32_t render_width = refl_tex.GetWidth(); int32_t render_height = refl_tex.GetHeight(); - rctx->set_scene_framebuffer_size(render_width, render_height, render_width, render_height); + rend_data_ctx.set_scene_framebuffer_size(render_width, render_height, render_width, render_height); if (shadow) - draw_pass_3d_shadow_set(shadow_ptr, rctx); + draw_pass_3d_shadow_set(rend_data_ctx, shadow_ptr, rctx); else - draw_pass_3d_shadow_reset(rctx); + draw_pass_3d_shadow_reset(rend_data_ctx, rctx); if (effect_texture) - gl_rend_state.active_bind_texture_2d(14, effect_texture->glid); + rend_data_ctx.state.active_bind_texture_2d(14, effect_texture->glid); else - gl_rend_state.active_bind_texture_2d(14, rctx->empty_texture_2d->glid); + rend_data_ctx.state.active_bind_texture_2d(14, rctx->empty_texture_2d->glid); - uniform_value[U_WATER_REFLECT] = 0; + rend_data_ctx.shader_flags.arr[U_WATER_REFLECT] = 0; - rctx->sss_data->set_texture(3); + rctx->sss_data->set_texture(rend_data_ctx.state, 3); - set_reflect_mat(rctx); + cam_data reflect_cam = cam; + set_reflect_mat(rend_data_ctx, reflect_cam); + rend_data_ctx.set_batch_scene_camera(reflect_cam); - uniform_value[U_REFLECT] = 1; + rend_data_ctx.shader_flags.arr[U_REFLECT] = 1; if (draw_pass_3d[DRAW_PASS_3D_OPAQUE]) { - gl_rend_state.enable_depth_test(); - gl_rend_state.set_depth_mask(GL_TRUE); - rctx->disp_manager->draw(mdl::OBJ_TYPE_REFLECT_CHARA_OPAQUE); - gl_rend_state.disable_depth_test(); + rend_data_ctx.state.enable_depth_test(); + rend_data_ctx.state.set_depth_mask(GL_TRUE); + rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_REFLECT_CHARA_OPAQUE, reflect_cam); + rend_data_ctx.state.disable_depth_test(); } if (draw_pass_3d[DRAW_PASS_3D_TRANSPARENT]) { - gl_rend_state.enable_depth_test(); - gl_rend_state.set_depth_mask(GL_TRUE); - rctx->disp_manager->draw(mdl::OBJ_TYPE_REFLECT_CHARA_TRANSPARENT); - gl_rend_state.disable_depth_test(); + rend_data_ctx.state.enable_depth_test(); + rend_data_ctx.state.set_depth_mask(GL_TRUE); + rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_REFLECT_CHARA_TRANSPARENT, reflect_cam); + rend_data_ctx.state.disable_depth_test(); } if (npr_param == 1) - pass_3d_contour(); + pass_3d_contour(rend_data_ctx); if (draw_pass_3d[DRAW_PASS_3D_TRANSLUCENT]) { - gl_rend_state.enable_blend(); - gl_rend_state.set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - gl_rend_state.enable_depth_test(); - gl_rend_state.set_depth_mask(GL_FALSE); - rctx->disp_manager->draw(mdl::OBJ_TYPE_REFLECT_CHARA_TRANSLUCENT); - gl_rend_state.disable_depth_test(); - gl_rend_state.disable_blend(); + rend_data_ctx.state.enable_blend(); + rend_data_ctx.state.set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + rend_data_ctx.state.enable_depth_test(); + rend_data_ctx.state.set_depth_mask(GL_FALSE); + rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_REFLECT_CHARA_TRANSLUCENT, reflect_cam); + rend_data_ctx.state.disable_depth_test(); + rend_data_ctx.state.disable_blend(); } if (shadow) - draw_pass_3d_shadow_reset(rctx); + draw_pass_3d_shadow_reset(rend_data_ctx, rctx); - rctx->set_scene_framebuffer_size(render->render_width[0], + rend_data_ctx.set_scene_framebuffer_size(render->render_width[0], render->render_height[0], render->render_width[0], render->render_height[0]); reflect_draw = false; } else if (reflect_type == STAGE_DATA_REFLECT_REFLECT_MAP) { - uniform_value[U_REFLECT] = reflect_tone_curve ? 1 : 0; - uniform_value[U_CLIP_PLANE] = clip_plane.data[0] ? 1 : 0; - rctx->disp_manager->draw(mdl::OBJ_TYPE_REFLECT_CHARA_OPAQUE); + rend_data_ctx.shader_flags.arr[U_REFLECT] = reflect_tone_curve ? 1 : 0; + rend_data_ctx.shader_flags.arr[U_CLIP_PLANE] = clip_plane.data[0] ? 1 : 0; + rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_REFLECT_CHARA_OPAQUE, cam); } - gl_rend_state.disable_depth_test(); - uniform_value[U_REFLECT] = 0; - rctx->draw_state->shader_index = -1; + rend_data_ctx.state.disable_depth_test(); + rend_data_ctx.shader_flags.arr[U_REFLECT] = 0; + rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = -1; for (int32_t i = reflect_blur_num, j = 0; i > 0; i--, j++) { - blur_filter_apply(rctx, &refl_buf_tex, &refl_tex, + blur_filter_apply(rend_data_ctx, rctx, &refl_buf_tex, &refl_tex, reflect_blur_filter, 1.0f, 1.0f, 0.0f); - image_filter_scale(&refl_tex, refl_buf_tex.color_texture); + image_filter_scale(rend_data_ctx, &refl_tex, refl_buf_tex.color_texture); } } else { @@ -809,28 +841,26 @@ namespace rndr { glClear(GL_COLOR_BUFFER_BIT); glClearColor(clear_color.x, clear_color.y, clear_color.z, clear_color.w); } - shader::unbind(); - gl_rend_state.bind_framebuffer(0); - gl_rend_state.end_event(); + shader::unbind(rend_data_ctx.state); + rend_data_ctx.state.bind_framebuffer(0); + rend_data_ctx.state.end_event(); } - void RenderManager::pass_refract() { + void RenderManager::pass_refract(render_data_context& rend_data_ctx) { render_context* rctx = rctx_ptr; - gl_rend_state.begin_event("pass_refract"); + rend_data_ctx.state.begin_event("pass_refract"); RenderTexture& refract_texture = rctx->render_manager->get_render_texture(1); - refract_texture.Bind(); + refract_texture.Bind(rend_data_ctx.state); if (rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFRACT_OPAQUE) || rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFRACT_TRANSPARENT) || rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFRACT_TRANSLUCENT)) { texture* refr_tex = refract_texture.color_texture; - gl_rend_state.set_viewport(0, 0, refr_tex->width, refr_tex->height); - - draw_pass_set_camera(); + rend_data_ctx.state.set_viewport(0, 0, refr_tex->width, refr_tex->height); for (int32_t i = LIGHT_SET_MAIN; i < LIGHT_SET_MAX; i++) - rctx->light_set[i].data_set(rctx->face, (light_set_id)i); + rctx->light_set[i].data_set(rend_data_ctx, rctx->face, (light_set_id)i); for (int32_t i = FOG_DEPTH; i < FOG_BUMP; i++) - rctx->fog[i].data_set((fog_id)i); + rctx->fog[i].data_set(rend_data_ctx, (fog_id)i); vec4 clear_color; glGetFloatv(GL_COLOR_CLEAR_VALUE, (GLfloat*)&clear_color); @@ -838,15 +868,15 @@ namespace rndr { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearColor(clear_color.x, clear_color.y, clear_color.z, clear_color.w); - rctx->draw_state->shader_index = SHADER_FT_S_REFR; - gl_rend_state.enable_depth_test(); - gl_rend_state.set_depth_func(GL_LEQUAL); - gl_rend_state.set_depth_mask(GL_TRUE); - rctx->disp_manager->draw(mdl::OBJ_TYPE_REFRACT_OPAQUE); - rctx->disp_manager->draw(mdl::OBJ_TYPE_REFRACT_TRANSPARENT); - rctx->disp_manager->draw(mdl::OBJ_TYPE_REFRACT_TRANSLUCENT); - gl_rend_state.disable_depth_test(); - rctx->draw_state->shader_index = -1; + rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = SHADER_FT_S_REFR; + rend_data_ctx.state.enable_depth_test(); + rend_data_ctx.state.set_depth_func(GL_LEQUAL); + rend_data_ctx.state.set_depth_mask(GL_TRUE); + rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_REFRACT_OPAQUE, cam); + rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_REFRACT_TRANSPARENT, cam); + rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_REFRACT_TRANSLUCENT, cam); + rend_data_ctx.state.disable_depth_test(); + rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = -1; } else { vec4 clear_color; @@ -855,40 +885,40 @@ namespace rndr { glClear(GL_COLOR_BUFFER_BIT); glClearColor(clear_color.x, clear_color.y, clear_color.z, clear_color.w); } - shader::unbind(); - gl_rend_state.bind_framebuffer(0); - gl_rend_state.end_event(); + shader::unbind(rend_data_ctx.state); + rend_data_ctx.state.bind_framebuffer(0); + rend_data_ctx.state.end_event(); } - void RenderManager::pass_pre_process() { - gl_rend_state.begin_event("pass_pre_process"); + void RenderManager::pass_pre_process(render_data_context& rend_data_ctx) { + rend_data_ctx.state.begin_event("pass_pre_process"); for (draw_pre_process& i : pre_process) if (i.func) - i.func(i.data); - shader::unbind(); - gl_rend_state.bind_framebuffer(0); - gl_rend_state.end_event(); + i.func(rend_data_ctx, i.data, cam); + shader::unbind(rend_data_ctx.state); + rend_data_ctx.state.bind_framebuffer(0); + rend_data_ctx.state.end_event(); } - void RenderManager::pass_clear() { + void RenderManager::pass_clear(render_data_context& rend_data_ctx) { render_context* rctx = rctx_ptr; - gl_rend_state.begin_event("pass_clear"); + rend_data_ctx.state.begin_event("pass_clear"); if (clear) { - rctx->screen_buffer.Bind(); + rctx->screen_buffer.Bind(rend_data_ctx.state); clear_color_set_gl(); //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT); - gl_rend_state.bind_framebuffer(0); + rend_data_ctx.state.bind_framebuffer(0); } rndr::Render* rend = render; if (!rctx->sss_data->enable || !rctx->sss_data->npr_contour) { - rend->bind_render_texture(); + rend->bind_render_texture(rend_data_ctx.state); if (sprite_manager_get_reqlist_count(2)) { glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearDepthf(1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - gl_rend_state.bind_framebuffer(0); + rend_data_ctx.state.bind_framebuffer(0); } else { clear_color_set_gl(); @@ -897,273 +927,246 @@ namespace rndr { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); else glClear(GL_DEPTH_BUFFER_BIT); - gl_rend_state.bind_framebuffer(0); + rend_data_ctx.state.bind_framebuffer(0); } } else { if (sprite_manager_get_reqlist_count(2)) { - rend->bind_render_texture(); + rend->bind_render_texture(rend_data_ctx.state); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT); - gl_rend_state.bind_framebuffer(0); + rend_data_ctx.state.bind_framebuffer(0); } else if (clear) { - rend->bind_render_texture(); + rend->bind_render_texture(rend_data_ctx.state); clear_color_set_gl(); glClear(GL_COLOR_BUFFER_BIT); - gl_rend_state.bind_framebuffer(0); + rend_data_ctx.state.bind_framebuffer(0); } } gl_get_error_print(); - gl_rend_state.end_event(); + rend_data_ctx.state.end_event(); } - void RenderManager::pass_pre_sprite() { + void RenderManager::pass_pre_sprite(render_data_context& rend_data_ctx) { if (!sprite_manager_get_reqlist_count(2)) return; render_context* rctx = rctx_ptr; - gl_rend_state.begin_event("pass_pre_sprite"); + rend_data_ctx.state.begin_event("pass_pre_sprite"); rndr::Render* rend = render; - rend->bind_render_texture(true); + rend->bind_render_texture(rend_data_ctx.state, true); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT); - gl_rend_state.set_depth_mask(GL_FALSE); - gl_rend_state.disable_depth_test(); - gl_rend_state.enable_blend(); - gl_rend_state.disable_cull_face(); - sprite_manager_draw(2, true, + rend_data_ctx.state.set_depth_mask(GL_FALSE); + rend_data_ctx.state.disable_depth_test(); + rend_data_ctx.state.enable_blend(); + rend_data_ctx.state.disable_cull_face(); + sprite_manager_draw(rend_data_ctx, 2, true, rend->temp_buffer.color_texture, rctx->camera->view_projection_aet_3d); - gl_rend_state.enable_cull_face(); - gl_rend_state.disable_blend(); - gl_rend_state.enable_depth_test(); - gl_rend_state.set_depth_mask(GL_TRUE); - shader::unbind(); - gl_rend_state.bind_framebuffer(0); + rend_data_ctx.state.enable_cull_face(); + rend_data_ctx.state.disable_blend(); + rend_data_ctx.state.enable_depth_test(); + rend_data_ctx.state.set_depth_mask(GL_TRUE); + shader::unbind(rend_data_ctx.state); + rend_data_ctx.state.bind_framebuffer(0); gl_get_error_print(); - gl_rend_state.end_event(); + rend_data_ctx.state.end_event(); } - void RenderManager::pass_3d() { + void RenderManager::pass_3d(render_data_context& rend_data_ctx) { render_context* rctx = rctx_ptr; - render->bind_render_texture(); - draw_pass_set_camera(); + render->bind_render_texture(rend_data_ctx.state); if (!rctx->sss_data->enable || !rctx->sss_data->npr_contour || draw_pass_3d_get_translucent_count(rctx)) { - gl_rend_state.set_depth_mask(GL_TRUE); + rend_data_ctx.state.set_depth_mask(GL_TRUE); glClear(GL_DEPTH_BUFFER_BIT); } - gl_rend_state.set_depth_func(GL_LEQUAL); + rend_data_ctx.state.set_depth_func(GL_LEQUAL); + rend_data_ctx.set_batch_scene_camera(cam); for (int32_t i = LIGHT_SET_MAIN; i < LIGHT_SET_MAX; i++) - rctx->light_set[i].data_set(rctx->face, (light_set_id)i); + rctx->light_set[i].data_set(rend_data_ctx, rctx->face, (light_set_id)i); for (int32_t i = FOG_DEPTH; i < FOG_MAX; i++) - rctx->fog[i].data_set((fog_id)i); + rctx->fog[i].data_set(rend_data_ctx, (fog_id)i); if (shadow) - draw_pass_3d_shadow_set(shadow_ptr, rctx); + draw_pass_3d_shadow_set(rend_data_ctx, shadow_ptr, rctx); else - draw_pass_3d_shadow_reset(rctx); + draw_pass_3d_shadow_reset(rend_data_ctx, rctx); if (effect_texture) - gl_rend_state.active_bind_texture_2d(14, effect_texture->glid); + rend_data_ctx.state.active_bind_texture_2d(14, effect_texture->glid); else - gl_rend_state.active_bind_texture_2d(14, rctx->empty_texture_2d->glid); + rend_data_ctx.state.active_bind_texture_2d(14, rctx->empty_texture_2d->glid); if (pass_sw[RND_PASSID_REFLECT] && reflect) { RenderTexture& refl_tex = get_render_texture(0); - gl_rend_state.active_bind_texture_2d(15, refl_tex.GetColorTex()); - uniform_value[U_WATER_REFLECT] = 1; + rend_data_ctx.state.active_bind_texture_2d(15, refl_tex.GetColorTex()); + rend_data_ctx.shader_flags.arr[U_WATER_REFLECT] = 1; } else { - gl_rend_state.active_bind_texture_2d(15, rctx->empty_texture_2d->glid); - uniform_value[U_WATER_REFLECT] = 0; + rend_data_ctx.state.active_bind_texture_2d(15, rctx->empty_texture_2d->glid); + rend_data_ctx.shader_flags.arr[U_WATER_REFLECT] = 0; } - rctx->sss_data->set_texture(1); + rctx->sss_data->set_texture(rend_data_ctx.state, 1); - gl_rend_state.bind_sampler(14, rctx->render_samplers[0]); - gl_rend_state.bind_sampler(15, rctx->render_samplers[0]); - gl_rend_state.bind_sampler(16, rctx->render_samplers[0]); + rend_data_ctx.state.bind_sampler(14, rctx->render_samplers[0]); + rend_data_ctx.state.bind_sampler(15, rctx->render_samplers[0]); + rend_data_ctx.state.bind_sampler(16, rctx->render_samplers[0]); - uniform_value[U_STAGE_AMBIENT] = light_stage_ambient ? 1 : 0; + rend_data_ctx.shader_flags.arr[U_STAGE_AMBIENT] = light_stage_ambient ? 1 : 0; if (alpha_z_sort) { - rctx->disp_manager->obj_sort(&rctx->view_mat, - mdl::OBJ_TYPE_TRANSLUCENT, 1, field_31F); - rctx->disp_manager->obj_sort(&rctx->view_mat, - mdl::OBJ_TYPE_TRANSLUCENT_SORT_BY_RADIUS, 2); - rctx->disp_manager->obj_sort(&rctx->view_mat, - mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_1, 1, field_31F); - rctx->disp_manager->obj_sort(&rctx->view_mat, - mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_2, 1, field_31F); - rctx->disp_manager->obj_sort(&rctx->view_mat, - mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_3, 1, field_31F); + rctx->disp_manager->obj_sort(rend_data_ctx, + mdl::OBJ_TYPE_TRANSLUCENT, 1, cam, field_31F); + rctx->disp_manager->obj_sort(rend_data_ctx, + mdl::OBJ_TYPE_TRANSLUCENT_SORT_BY_RADIUS, 2, cam); + rctx->disp_manager->obj_sort(rend_data_ctx, + mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_1, 1, cam, field_31F); + rctx->disp_manager->obj_sort(rend_data_ctx, + mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_2, 1, cam, field_31F); + rctx->disp_manager->obj_sort(rend_data_ctx, + mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_3, 1, cam, field_31F); } if (opaque_z_sort) - rctx->disp_manager->obj_sort(&rctx->view_mat, mdl::OBJ_TYPE_OPAQUE, 0); + rctx->disp_manager->obj_sort(rend_data_ctx, mdl::OBJ_TYPE_OPAQUE, 0, cam); if (draw_pass_3d[DRAW_PASS_3D_OPAQUE]) { - gl_rend_state.enable_depth_test(); - gl_rend_state.set_depth_mask(GL_TRUE); - rctx->disp_manager->draw(mdl::OBJ_TYPE_OPAQUE); - gl_rend_state.disable_depth_test(); + rend_data_ctx.state.enable_depth_test(); + rend_data_ctx.state.set_depth_mask(GL_TRUE); + rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_OPAQUE, cam); + rend_data_ctx.state.disable_depth_test(); } - Glitter::glt_particle_manager->DispScenes(Glitter::DISP_OPAQUE); + Glitter::glt_particle_manager->DispScenes(rend_data_ctx, Glitter::DISP_OPAQUE); - gl_rend_state.enable_depth_test(); - gl_rend_state.set_depth_mask(GL_TRUE); + rend_data_ctx.state.enable_depth_test(); + rend_data_ctx.state.set_depth_mask(GL_TRUE); if (draw_pass_3d[DRAW_PASS_3D_TRANSPARENT]) - rctx->disp_manager->draw(mdl::OBJ_TYPE_TRANSPARENT); + rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_TRANSPARENT, cam); if (rctx->render_manager->field_120) - rctx->disp_manager->draw(mdl::OBJ_TYPE_TYPE_7); + rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_TYPE_7, cam); - render->calc_exposure_chara_data(rctx->camera); + render->calc_exposure_chara_data(rend_data_ctx, cam); if (npr_param == 1) - pass_3d_contour(); + pass_3d_contour(rend_data_ctx); - render->draw_lens_flare(rctx->camera); - star_catalog_draw(); + render->draw_lens_flare(rend_data_ctx, cam); + star_catalog_draw(rend_data_ctx, cam); - draw_pass_3d_translucent(rctx, + draw_pass_3d_translucent(rend_data_ctx, rctx, mdl::OBJ_TYPE_OPAQUE_ALPHA_ORDER_3, mdl::OBJ_TYPE_TRANSPARENT_ALPHA_ORDER_3, - mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_3); + mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_3, cam); - snow_particle_draw(); - rain_particle_draw(); - leaf_particle_draw(); - particle_draw(); - gl_rend_state.disable_depth_test(); + snow_particle_draw(rend_data_ctx, cam); + rain_particle_draw(rend_data_ctx, cam); + leaf_particle_draw(rend_data_ctx, cam); + particle_draw(rend_data_ctx, cam); + rend_data_ctx.state.disable_depth_test(); - gl_rend_state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); - Glitter::glt_particle_manager->DispScenes(Glitter::DISP_ALPHA); - gl_rend_state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); + Glitter::glt_particle_manager->DispScenes(rend_data_ctx, Glitter::DISP_ALPHA); + rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); /*if (npr_param == 1) { - gl_rend_state.set_color_mask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE); + rend_data_ctx.state.set_color_mask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT); - gl_rend_state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); }*/ - gl_rend_state.enable_depth_test(); + rend_data_ctx.state.enable_depth_test(); if (draw_pass_3d[DRAW_PASS_3D_TRANSLUCENT]) { - gl_rend_state.enable_blend(); - gl_rend_state.set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - gl_rend_state.set_depth_mask(GL_FALSE); - rctx->disp_manager->draw(mdl::OBJ_TYPE_TRANSLUCENT_SORT_BY_RADIUS); - rctx->disp_manager->draw(mdl::OBJ_TYPE_TRANSLUCENT); - gl_rend_state.disable_blend(); + rend_data_ctx.state.enable_blend(); + rend_data_ctx.state.set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + rend_data_ctx.state.set_depth_mask(GL_FALSE); + rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_TRANSLUCENT_SORT_BY_RADIUS, cam); + rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_TRANSLUCENT, cam); + rend_data_ctx.state.disable_blend(); } - gl_rend_state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); // X - Glitter::glt_particle_manager->DispScenes(Glitter::DISP_TYPE_2); - gl_rend_state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); // X + Glitter::glt_particle_manager->DispScenes(rend_data_ctx, Glitter::DISP_TYPE_2); + rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - gl_rend_state.set_depth_mask(GL_TRUE); - draw_pass_3d_translucent(rctx, + rend_data_ctx.state.set_depth_mask(GL_TRUE); + draw_pass_3d_translucent(rend_data_ctx, rctx, mdl::OBJ_TYPE_OPAQUE_ALPHA_ORDER_2, mdl::OBJ_TYPE_TRANSPARENT_ALPHA_ORDER_2, - mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_2); - gl_rend_state.disable_depth_test(); + mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_2, cam); + rend_data_ctx.state.disable_depth_test(); - gl_rend_state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); - Glitter::glt_particle_manager->DispScenes(Glitter::DISP_NORMAL); - gl_rend_state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); + Glitter::glt_particle_manager->DispScenes(rend_data_ctx, Glitter::DISP_NORMAL); + rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - gl_rend_state.enable_depth_test(); - gl_rend_state.set_depth_mask(GL_TRUE); - draw_pass_3d_translucent(rctx, + rend_data_ctx.state.enable_depth_test(); + rend_data_ctx.state.set_depth_mask(GL_TRUE); + draw_pass_3d_translucent(rend_data_ctx, rctx, mdl::OBJ_TYPE_OPAQUE_ALPHA_ORDER_1, mdl::OBJ_TYPE_TRANSPARENT_ALPHA_ORDER_1, - mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_1); + mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_1, cam); if (Glitter::glt_particle_manager->CheckHasLocalEffect()) { // X - gl_rend_state.begin_event("local"); + rend_data_ctx.state.begin_event("local"); + + cam_data local_cam = cam; + local_cam.set_fov(32.2673416137695f); + rend_data_ctx.set_batch_scene_camera(local_cam); if (alpha_z_sort) - rctx->disp_manager->obj_sort(&rctx->view_mat, mdl::OBJ_TYPE_LOCAL_TRANSLUCENT, 1); + rctx->disp_manager->obj_sort(rend_data_ctx, mdl::OBJ_TYPE_LOCAL_TRANSLUCENT, 1, local_cam); if (opaque_z_sort) - rctx->disp_manager->obj_sort(&rctx->view_mat, mdl::OBJ_TYPE_LOCAL_OPAQUE, 0); + rctx->disp_manager->obj_sort(rend_data_ctx, mdl::OBJ_TYPE_LOCAL_OPAQUE, 0, local_cam); - camera* cam = rctx->camera; - float_t fov = cam->get_fov(); - cam->set_fov(32.2673416137695f); - draw_pass_set_camera(); + rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_LOCAL_OPAQUE, local_cam); + rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_LOCAL_TRANSPARENT, local_cam); + rend_data_ctx.state.enable_blend(); + rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_LOCAL_TRANSLUCENT, local_cam); + rend_data_ctx.state.disable_blend(); - rctx->disp_manager->draw(mdl::OBJ_TYPE_LOCAL_OPAQUE); - rctx->disp_manager->draw(mdl::OBJ_TYPE_LOCAL_TRANSPARENT); - gl_rend_state.enable_blend(); - rctx->disp_manager->draw(mdl::OBJ_TYPE_LOCAL_TRANSLUCENT); - gl_rend_state.disable_blend(); + rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); + Glitter::glt_particle_manager->DispScenes(rend_data_ctx, Glitter::DISP_LOCAL); + rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - gl_rend_state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); - Glitter::glt_particle_manager->DispScenes(Glitter::DISP_LOCAL); - gl_rend_state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - cam->set_fov(fov); + rend_data_ctx.state.end_event(); - gl_rend_state.end_event(); - - draw_pass_set_camera(); + rend_data_ctx.set_batch_scene_camera(cam); } - gl_rend_state.active_bind_texture_2d(14, 0); - gl_rend_state.active_bind_texture_2d(15, 0); + rend_data_ctx.state.active_bind_texture_2d(14, 0); + rend_data_ctx.state.active_bind_texture_2d(15, 0); - gl_rend_state.disable_depth_test(); + rend_data_ctx.state.disable_depth_test(); if (shadow) - draw_pass_3d_shadow_reset(rctx); - pass_sprite_surf(); - shader::unbind(); - gl_rend_state.bind_framebuffer(0); + draw_pass_3d_shadow_reset(rend_data_ctx, rctx); + pass_sprite_surf(rend_data_ctx); + shader::unbind(rend_data_ctx.state); + rend_data_ctx.state.bind_framebuffer(0); } - void RenderManager::pass_show_vector() { - return; - /*if (!show_vector_flags) - return; - - render_context* rctx = rctx_ptr; - gl_rend_state.begin_event("pass_show_vector"); - - rctx->camera->update_data(); - rctx->view_mat = rctx->camera->view; - render->bind_render_texture(); - draw_pass_set_camera(); - - //shaders_ft.env_vert_set(20, show_vector_length, show_vector_z_offset, 0.0f, 0.0f); - for (int32_t i = 1; i < 4; i++) { - if (!(show_vector_flags & (1 << (i - 1)))) - continue; - - if (draw_pass_3d[DRAW_PASS_3D_OPAQUE]) - draw_task_draw_objects_by_type_show_vector(rctx, mdl::OBJ_TYPE_OPAQUE, i); - if (draw_pass_3d[DRAW_PASS_3D_TRANSPARENT]) - draw_task_draw_objects_by_type_show_vector(rctx, mdl::OBJ_TYPE_TRANSPARENT, i); - if (draw_pass_3d[DRAW_PASS_3D_TRANSLUCENT]) { - draw_task_draw_objects_by_type_show_vector(rctx, mdl::OBJ_TYPE_TRANSLUCENT_SORT_BY_RADIUS, i); - draw_task_draw_objects_by_type_show_vector(rctx, mdl::OBJ_TYPE_TRANSLUCENT, i); - } + void RenderManager::pass_show_vector(render_data_context& rend_data_ctx) { + if (show_vector_flags) { + rend_data_ctx.state.begin_event("pass_show_vector"); + rend_data_ctx.state.end_event(); } - shader::unbind(); - gl_rend_state.bind_framebuffer(0); - gl_rend_state.end_event();*/ } - void RenderManager::pass_post_process() { + void RenderManager::pass_post_process(render_data_context& rend_data_ctx) { render_context* rctx = rctx_ptr; - gl_rend_state.begin_event("pass_post_process"); + rend_data_ctx.state.begin_event("pass_post_process"); texture* light_proj_tex = 0; light_proj* litproj = rctx->litproj; @@ -1174,56 +1177,56 @@ namespace rndr { light_proj_tex = litproj->draw_texture.color_texture; } - render->apply_post_process(rctx->camera, light_proj_tex, npr_param); - gl_rend_state.end_event(); + render->apply_post_process(rend_data_ctx, cam, light_proj_tex, npr_param); + rend_data_ctx.state.end_event(); } - void RenderManager::pass_sprite() { + void RenderManager::pass_sprite(render_data_context& rend_data_ctx) { render_context* rctx = rctx_ptr; if (!sprite_manager_get_reqlist_count(0)) return; - gl_rend_state.begin_event("pass_sprite"); + rend_data_ctx.state.begin_event("pass_sprite"); rndr::Render* rend = render; - gl_rend_state.set_viewport(0, 0, width, height); + rend_data_ctx.state.set_viewport(0, 0, width, height); #ifdef USE_OPENGL if (!Vulkan::use && multisample && multisample_framebuffer) { - gl_rend_state.bind_framebuffer(multisample_framebuffer); - gl_rend_state.enable_multisample(); + rend_data_ctx.state.bind_framebuffer(multisample_framebuffer); + rend_data_ctx.state.enable_multisample(); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT); } else - rctx->screen_buffer.Bind(); + rctx->screen_buffer.Bind(rend_data_ctx.state); #endif - gl_rend_state.disable_depth_test(); - gl_rend_state.enable_blend(); - gl_rend_state.disable_cull_face(); - sprite_manager_draw(0, true, + rend_data_ctx.state.disable_depth_test(); + rend_data_ctx.state.enable_blend(); + rend_data_ctx.state.disable_cull_face(); + sprite_manager_draw(rend_data_ctx, 0, true, rctx->screen_overlay_buffer.color_texture, rctx->camera->view_projection_aet_2d); - gl_rend_state.enable_cull_face(); - gl_rend_state.disable_blend(); - gl_rend_state.enable_depth_test(); + rend_data_ctx.state.enable_cull_face(); + rend_data_ctx.state.disable_blend(); + rend_data_ctx.state.enable_depth_test(); #ifdef USE_OPENGL if (!Vulkan::use && multisample && multisample_framebuffer) { - gl_rend_state.bind_framebuffer(rctx->screen_buffer.fbos[0]); - gl_rend_state.disable_multisample(); - gl_rend_state.bind_read_framebuffer(multisample_framebuffer); + rend_data_ctx.state.bind_framebuffer(rctx->screen_buffer.fbos[0]); + rend_data_ctx.state.disable_multisample(); + rend_data_ctx.state.bind_read_framebuffer(multisample_framebuffer); glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_NEAREST); - gl_rend_state.bind_read_framebuffer(0); + rend_data_ctx.state.bind_read_framebuffer(0); } #endif gl_get_error_print(); - gl_rend_state.bind_framebuffer(0); - gl_rend_state.end_event(); + rend_data_ctx.state.bind_framebuffer(0); + rend_data_ctx.state.end_event(); } - void RenderManager::pass_3d_contour() { + void RenderManager::pass_3d_contour(render_data_context& rend_data_ctx) { render_context* rctx = rctx_ptr; RenderTexture* rt; RenderTexture* contour_rt; @@ -1236,111 +1239,98 @@ namespace rndr { contour_rt = render->sss_contour_texture; } - gl_rend_state.begin_event("`anonymous-namespace'::draw_npr_frame"); - gl_rend_state.enable_blend(); - gl_rend_state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); - gl_rend_state.set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - gl_rend_state.set_blend_equation(GL_FUNC_ADD); - gl_rend_state.disable_depth_test(); + rend_data_ctx.state.begin_event("`anonymous-namespace'::draw_npr_frame"); + rend_data_ctx.state.enable_blend(); + rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); + rend_data_ctx.state.set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + rend_data_ctx.state.set_blend_equation(GL_FUNC_ADD); + rend_data_ctx.state.disable_depth_test(); quad_shader_data quad_data = {}; quad_data.g_texcoord_modifier = { 0.5f, 0.5f, 0.5f, 0.5f }; - rctx->quad_ubo.WriteMemory(quad_data); + rctx->quad_ubo.WriteMemory(rend_data_ctx.state, quad_data); contour_params_shader_data contour_params_data = {}; - contour_params_data.g_near_far = rctx->g_near_far; - rctx->contour_params_ubo.WriteMemory(contour_params_data); + const float_t max_distance = rctx->camera->max_distance; + const float_t min_distance = rctx->camera->min_distance; + contour_params_data.g_near_far = { + (float_t)(max_distance / (max_distance - min_distance)), + (float_t)(-(max_distance * min_distance) / (max_distance - min_distance)), + min_distance, max_distance + }; + rctx->contour_params_ubo.WriteMemory(rend_data_ctx.state, contour_params_data); - shaders_ft.set(SHADER_FT_CONTOUR_NPR); - gl_rend_state.active_bind_texture_2d(14, rt->GetDepthTex()); - gl_rend_state.active_bind_texture_2d(16, contour_rt->GetColorTex()); - gl_rend_state.active_bind_texture_2d(17, contour_rt->GetDepthTex()); - gl_rend_state.bind_sampler(14, rctx->render_samplers[1]); - gl_rend_state.bind_sampler(16, rctx->render_samplers[1]); - gl_rend_state.bind_sampler(17, rctx->render_samplers[1]); - rctx->quad_ubo.Bind(0); - rctx->contour_params_ubo.Bind(2); - gl_rend_state.bind_vertex_array(rctx->common_vao); - shaders_ft.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_CONTOUR_NPR); + rend_data_ctx.state.active_bind_texture_2d(14, rt->GetDepthTex()); + rend_data_ctx.state.active_bind_texture_2d(16, contour_rt->GetColorTex()); + rend_data_ctx.state.active_bind_texture_2d(17, contour_rt->GetDepthTex()); + rend_data_ctx.state.bind_sampler(14, rctx->render_samplers[1]); + rend_data_ctx.state.bind_sampler(16, rctx->render_samplers[1]); + rend_data_ctx.state.bind_sampler(17, rctx->render_samplers[1]); + rend_data_ctx.state.bind_uniform_buffer_base(0, rctx->quad_ubo); + rend_data_ctx.state.bind_uniform_buffer_base(2, rctx->contour_params_ubo); + rend_data_ctx.state.bind_vertex_array(rctx->common_vao); + rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); if (effect_texture) - gl_rend_state.active_bind_texture_2d(14, effect_texture->glid); + rend_data_ctx.state.active_bind_texture_2d(14, effect_texture->glid); else - gl_rend_state.active_bind_texture_2d(14, rctx->empty_texture_2d->glid); - gl_rend_state.bind_sampler(14, rctx->render_samplers[0]); - gl_rend_state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - gl_rend_state.enable_depth_test(); - gl_rend_state.disable_blend(); - gl_rend_state.end_event(); + rend_data_ctx.state.active_bind_texture_2d(14, rctx->empty_texture_2d->glid); + rend_data_ctx.state.bind_sampler(14, rctx->render_samplers[0]); + rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + rend_data_ctx.state.enable_depth_test(); + rend_data_ctx.state.disable_blend(); + rend_data_ctx.state.end_event(); } - void RenderManager::pass_sprite_surf() { + void RenderManager::pass_sprite_surf(render_data_context& rend_data_ctx) { if (!sprite_manager_get_reqlist_count(1)) return; render_context* rctx = rctx_ptr; rndr::Render* rend = render; - gl_rend_state.set_depth_mask(GL_FALSE); - gl_rend_state.disable_depth_test(); - gl_rend_state.enable_blend(); - gl_rend_state.disable_cull_face(); - sprite_manager_draw(1, true, + rend_data_ctx.state.set_depth_mask(GL_FALSE); + rend_data_ctx.state.disable_depth_test(); + rend_data_ctx.state.enable_blend(); + rend_data_ctx.state.disable_cull_face(); + sprite_manager_draw(rend_data_ctx, 1, true, rend->temp_buffer.color_texture, rctx->camera->view_projection_aet_2d); } } -void image_filter_scale(RenderTexture* dst, texture* src, const vec4& scale) { +void image_filter_scale(render_data_context& rend_data_ctx, RenderTexture* dst, texture* src, const vec4& scale) { if (!dst || !dst->color_texture->glid || !dst->color_texture || !src || !src->glid) return; render_context* rctx = rctx_ptr; - gl_rend_state.begin_event("`anonymous-namespace'::Impl::apply_no_filter_sub"); + rend_data_ctx.state.begin_event("`anonymous-namespace'::Impl::apply_no_filter_sub"); - dst->Bind(); - dst->SetViewport(); + dst->Bind(rend_data_ctx.state); + dst->SetViewport(rend_data_ctx.state); filter_scene_shader_data filter_scene = {}; filter_scene.g_transform = { 1.0f, 1.0f, 0.0f, 0.0f }; filter_scene.g_texcoord = { 1.0f, 1.0f, 0.0f, 0.0f }; - rctx->filter_scene_ubo.WriteMemory(filter_scene); + rctx->filter_scene_ubo.WriteMemory(rend_data_ctx.state, filter_scene); imgfilter_batch_shader_data imgfilter_batch = {}; imgfilter_batch.g_color_scale = scale; imgfilter_batch.g_color_offset = 0.0f; imgfilter_batch.g_texture_lod = 0.0f; - rctx->imgfilter_batch_ubo.WriteMemory(imgfilter_batch); + rctx->imgfilter_batch_ubo.WriteMemory(rend_data_ctx.state, imgfilter_batch); - uniform_value[U_IMAGE_FILTER] = 5; - shaders_ft.set(SHADER_FT_IMGFILT); - rctx->filter_scene_ubo.Bind(0); - rctx->imgfilter_batch_ubo.Bind(1); - gl_rend_state.active_bind_texture_2d(0, src->glid); - gl_rend_state.bind_sampler(0, rctx->render_samplers[0]); - gl_rend_state.bind_vertex_array(rctx->common_vao); - shaders_ft.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); - gl_rend_state.end_event(); -} - -void draw_pass_set_camera() { - render_context* rctx = rctx_ptr; - camera* cam = rctx->camera; - rctx->view_mat = cam->view; - rctx->proj_mat = cam->projection; - rctx->vp_mat = cam->view_projection; - vec3 view_point; - cam->get_view_point(view_point); - rctx->set_scene_projection_view(rctx->view_mat, rctx->proj_mat, view_point); - - float_t max_distance = cam->max_distance; - float_t min_distance = cam->min_distance; - rctx->g_near_far = { - (float_t)(max_distance / (max_distance - min_distance)), - (float_t)(-(max_distance * min_distance) / (max_distance - min_distance)), - min_distance, max_distance - }; + rend_data_ctx.shader_flags.arr[U_IMAGE_FILTER] = 5; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_IMGFILT); + rend_data_ctx.state.bind_uniform_buffer_base(0, rctx->filter_scene_ubo); + rend_data_ctx.state.bind_uniform_buffer_base(1, rctx->imgfilter_batch_ubo); + rend_data_ctx.state.active_bind_texture_2d(0, src->glid); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); + rend_data_ctx.state.bind_vertex_array(rctx->common_vao); + rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); + rend_data_ctx.state.end_event(); } void render_manager_init_data(int32_t ssaa, int32_t hd_res, int32_t ss_alpha_mask, bool npr) { @@ -1379,12 +1369,13 @@ void render_manager_free_data() { rctx_ptr->sss_data->free(); } -static void draw_pass_shadow_begin_make_shadowmap(Shadow* shad, int32_t index, int32_t a3) { +static void draw_pass_shadow_begin_make_shadowmap(Shadow* shad, + render_data_context& rend_data_ctx, cam_data& cam, int32_t index, int32_t a3) { render_context* rctx = rctx_ptr; - shad->curr_render_textures[0]->Bind(); + shad->curr_render_textures[0]->Bind(rend_data_ctx.state); texture* tex = shad->curr_render_textures[0]->color_texture; - gl_rend_state.set_viewport(1, 1, tex->width - 2, tex->width - 2); - gl_rend_state.enable_depth_test(); + rend_data_ctx.state.set_viewport(1, 1, tex->width - 2, tex->width - 2); + rend_data_ctx.state.enable_depth_test(); glClearColor(1.0, 1.0, 1.0, 1.0); if (!a3) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -1407,63 +1398,54 @@ static void draw_pass_shadow_begin_make_shadowmap(Shadow* shad, int32_t index, i } const float_t scale = (float_t)(tex->width / 2) / (float_t)((tex->width - 2) / 2); - mat4 temp; - mat4_translate(offset, 0.0f, 0.0f, &temp); - mat4_scale_rot(&temp, scale, scale, 1.0f, &temp); - - mat4 proj; - mat4_ortho(-shadow_range, shadow_range, - -shadow_range, shadow_range, shad->z_near, shad->z_far, &proj); - mat4_mul(&proj, &temp, &rctx->proj_mat); - mat4_look_at(view_point, interest, &rctx->view_mat); - mat4_mul(&rctx->view_mat, &rctx->proj_mat, &rctx->vp_mat); - rctx->set_scene_projection_view(rctx->view_mat, rctx->proj_mat, *view_point); - - rctx->draw_state->shader_index = SHADER_FT_SIL; - uniform_value[U_DEPTH] = 0; + shad->calc_proj_view_mat(cam, *view_point, *interest, shadow_range, offset, scale); + rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = SHADER_FT_SIL; + rend_data_ctx.shader_flags.arr[U_DEPTH] = 0; } -static void draw_pass_shadow_end_make_shadowmap(Shadow* shad, int32_t index, int32_t a3) { +static void draw_pass_shadow_end_make_shadowmap(Shadow* shad, + render_data_context& rend_data_ctx, int32_t index, int32_t a3) { render_context* rctx = rctx_ptr; - gl_rend_state.disable_depth_test(); + rend_data_ctx.state.disable_depth_test(); - rctx->draw_state->shader_index = -1; + rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = -1; if (a3 == shad->num_shadow - 1) { - draw_pass_shadow_filter(&shad->render_textures[3], + draw_pass_shadow_filter(rend_data_ctx, &shad->render_textures[3], &shad->render_textures[4], shad->curr_render_textures[0], shad->field_2DC, shad->field_2E0 / (shad->field_208 * 2.0f), false); - draw_pass_shadow_esm_filter(&shad->render_textures[5], + draw_pass_shadow_esm_filter(rend_data_ctx, &shad->render_textures[5], &shad->render_textures[6], &shad->render_textures[3]); } RenderTexture* rend_tex = shad->curr_render_textures[1 + index]; RenderTexture& rend_buf_tex = rctx_ptr->shadow_buffer; - rend_tex->Bind(); + rend_tex->Bind(rend_data_ctx.state); - image_filter_scale(rend_tex, + image_filter_scale(rend_data_ctx, rend_tex, shad->curr_render_textures[0]->color_texture); if (shad->blur_filter_enable[index]) { for (int32_t i = shad->near_blur, j = 0; i > 0; i--, j++) { - blur_filter_apply(rctx, &rend_buf_tex, rend_tex, + blur_filter_apply(rend_data_ctx, rctx, &rend_buf_tex, rend_tex, shad->blur_filter, 1.0f, 1.0f, 0.0f); - image_filter_scale(rend_tex, rend_buf_tex.color_texture); + image_filter_scale(rend_data_ctx, rend_tex, rend_buf_tex.color_texture); } } else { - rend_buf_tex.Bind(); + rend_buf_tex.Bind(rend_data_ctx.state); glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); } - gl_rend_state.bind_framebuffer(0); - gl_rend_state.bind_texture_2d(rend_tex->GetColorTex()); + rend_data_ctx.state.bind_framebuffer(0); + rend_data_ctx.state.bind_texture_2d(rend_tex->GetColorTex()); glGenerateMipmap(GL_TEXTURE_2D); - gl_rend_state.bind_texture_2d(0); + rend_data_ctx.state.bind_texture_2d(0); } -static void draw_pass_shadow_filter(RenderTexture* a1, RenderTexture* a2, - RenderTexture* a3, float_t sigma, float_t far_texel_offset, bool enable_lit_proj) { +static void draw_pass_shadow_filter(render_data_context& rend_data_ctx, + RenderTexture* a1, RenderTexture* a2, RenderTexture* a3, + float_t sigma, float_t far_texel_offset, bool enable_lit_proj) { texture* v7 = a1->color_texture; texture* v9 = a2->color_texture; texture* v11 = v7; @@ -1475,11 +1457,11 @@ static void draw_pass_shadow_filter(RenderTexture* a1, RenderTexture* a2, render_context* rctx = rctx_ptr; - gl_rend_state.begin_event("`anonymous-namespace'::Impl::apply_esm_filter"); + rend_data_ctx.state.begin_event("`anonymous-namespace'::Impl::apply_esm_filter"); filter_scene_shader_data filter_scene = {}; filter_scene.g_transform = 0.0f; filter_scene.g_texcoord = { 1.0f, 1.0f, 0.0f, 0.0f }; - rctx->filter_scene_ubo.WriteMemory(filter_scene); + rctx->filter_scene_ubo.WriteMemory(rend_data_ctx.state, filter_scene); esm_filter_batch_shader_data esm_filter_batch = {}; esm_filter_batch.g_params = { 1.0f / (float_t)v7->width, 0.0f, far_texel_offset, far_texel_offset }; @@ -1488,92 +1470,93 @@ static void draw_pass_shadow_filter(RenderTexture* a1, RenderTexture* a2, for (int32_t i = 0; i < 8; i++) ((float_t*)esm_filter_batch.g_gauss)[i] = (float_t)(exp((double_t)((ssize_t)i * i) * v8) * v6); - uniform_value[U_LIGHT_PROJ] = enable_lit_proj ? 1 : 0; - shaders_ft.set(SHADER_FT_ESMGAUSS); - rctx->filter_scene_ubo.Bind(0); - rctx->esm_filter_batch_ubo.Bind(1); + rend_data_ctx.shader_flags.arr[U_LIGHT_PROJ] = enable_lit_proj ? 1 : 0; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_ESMGAUSS); + rend_data_ctx.state.bind_uniform_buffer_base(0, rctx->filter_scene_ubo); + rend_data_ctx.state.bind_uniform_buffer_base(1, rctx->esm_filter_batch_ubo); - gl_rend_state.set_viewport(0, 0, v7->width, v7->height); + rend_data_ctx.state.set_viewport(0, 0, v7->width, v7->height); - a2->Bind(); + a2->Bind(rend_data_ctx.state); esm_filter_batch.g_params = { 1.0f / (float_t)v7->width, 0.0f, far_texel_offset, far_texel_offset }; - rctx->esm_filter_batch_ubo.WriteMemory(esm_filter_batch); + rctx->esm_filter_batch_ubo.WriteMemory(rend_data_ctx.state, esm_filter_batch); - gl_rend_state.active_bind_texture_2d(0, v11->glid); - gl_rend_state.bind_sampler(0, rctx->render_samplers[0]); - gl_rend_state.bind_vertex_array(rctx->common_vao); - shaders_ft.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); + rend_data_ctx.state.active_bind_texture_2d(0, v11->glid); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); + rend_data_ctx.state.bind_vertex_array(rctx->common_vao); + rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); - a1->Bind(); + a1->Bind(rend_data_ctx.state); esm_filter_batch.g_params = { 0.0f, 1.0f / (float_t)v7->height, far_texel_offset, far_texel_offset }; - rctx->esm_filter_batch_ubo.WriteMemory(esm_filter_batch); + rctx->esm_filter_batch_ubo.WriteMemory(rend_data_ctx.state, esm_filter_batch); - gl_rend_state.active_bind_texture_2d(0, v9->glid); - gl_rend_state.bind_sampler(0, rctx->render_samplers[0]); - gl_rend_state.bind_vertex_array(rctx->common_vao); - shaders_ft.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); - shader::unbind(); - gl_rend_state.end_event(); + rend_data_ctx.state.active_bind_texture_2d(0, v9->glid); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); + rend_data_ctx.state.bind_vertex_array(rctx->common_vao); + rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); + shader::unbind(rend_data_ctx.state); + rend_data_ctx.state.end_event(); } -static void draw_pass_shadow_esm_filter(RenderTexture* dst, RenderTexture* buf, RenderTexture* src) { +static void draw_pass_shadow_esm_filter(render_data_context& rend_data_ctx, + RenderTexture* dst, RenderTexture* buf, RenderTexture* src) { texture* dst_tex = dst->color_texture; texture* buf_tex = buf->color_texture; texture* src_tex = src->color_texture; - gl_rend_state.begin_event("`anonymous-namespace'::Impl::apply_esm_min_filter"); + rend_data_ctx.state.begin_event("`anonymous-namespace'::Impl::apply_esm_min_filter"); if (!dst_tex || !dst_tex->glid || !buf_tex || !buf_tex->glid || !src_tex || !src_tex->glid) { - gl_rend_state.end_event(); + rend_data_ctx.state.end_event(); return; } render_context* rctx = rctx_ptr; - gl_rend_state.begin_event("minimize"); + rend_data_ctx.state.begin_event("minimize"); filter_scene_shader_data filter_scene = {}; filter_scene.g_transform = 0.0f; filter_scene.g_texcoord = { 1.0f, 1.0f, 0.0f, 0.0f }; - rctx->filter_scene_ubo.WriteMemory(filter_scene); + rctx->filter_scene_ubo.WriteMemory(rend_data_ctx.state, filter_scene); esm_filter_batch_shader_data esm_filter_batch = {}; esm_filter_batch.g_gauss[0] = 0.0f; esm_filter_batch.g_gauss[1] = 0.0f; - rctx->filter_scene_ubo.Bind(0); - rctx->esm_filter_batch_ubo.Bind(1); + rend_data_ctx.state.bind_uniform_buffer_base(0, rctx->filter_scene_ubo); + rend_data_ctx.state.bind_uniform_buffer_base(1, rctx->esm_filter_batch_ubo); - gl_rend_state.set_viewport(0, 0, dst_tex->width, dst_tex->height); + rend_data_ctx.state.set_viewport(0, 0, dst_tex->width, dst_tex->height); - buf->Bind(); + buf->Bind(rend_data_ctx.state); esm_filter_batch.g_params = { 1.0f / (float_t)src_tex->width, 1.0f / (float_t)src_tex->height, 0.0f, 0.0f }; - rctx->esm_filter_batch_ubo.WriteMemory(esm_filter_batch); + rctx->esm_filter_batch_ubo.WriteMemory(rend_data_ctx.state, esm_filter_batch); - uniform_value[U_ESM_FILTER] = 0; - shaders_ft.set(SHADER_FT_ESMFILT); - gl_rend_state.active_bind_texture_2d(0, src_tex->glid); - gl_rend_state.bind_sampler(0, rctx->render_samplers[0]); - gl_rend_state.bind_vertex_array(rctx->common_vao); - shaders_ft.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); - gl_rend_state.end_event(); + rend_data_ctx.shader_flags.arr[U_ESM_FILTER] = 0; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_ESMFILT); + rend_data_ctx.state.active_bind_texture_2d(0, src_tex->glid); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); + rend_data_ctx.state.bind_vertex_array(rctx->common_vao); + rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); + rend_data_ctx.state.end_event(); - gl_rend_state.begin_event("erosion"); - dst->Bind(); + rend_data_ctx.state.begin_event("erosion"); + dst->Bind(rend_data_ctx.state); esm_filter_batch.g_params = { 0.75f / (float_t)buf_tex->width, 0.75f / (float_t)buf_tex->height, 0.0f, 0.0f }; - rctx->esm_filter_batch_ubo.WriteMemory(esm_filter_batch); + rctx->esm_filter_batch_ubo.WriteMemory(rend_data_ctx.state, esm_filter_batch); - uniform_value[U_ESM_FILTER] = 1; - shaders_ft.set(SHADER_FT_ESMFILT); - gl_rend_state.active_bind_texture_2d(0, buf_tex->glid); - gl_rend_state.bind_sampler(0, rctx->render_samplers[0]); - gl_rend_state.bind_vertex_array(rctx->common_vao); - shaders_ft.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); - gl_rend_state.end_event(); - gl_rend_state.end_event(); + rend_data_ctx.shader_flags.arr[U_ESM_FILTER] = 1; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_ESMFILT); + rend_data_ctx.state.active_bind_texture_2d(0, buf_tex->glid); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); + rend_data_ctx.state.bind_vertex_array(rctx->common_vao); + rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); + rend_data_ctx.state.end_event(); + rend_data_ctx.state.end_event(); } -static bool draw_pass_shadow_litproj(light_proj* litproj) { +static bool draw_pass_shadow_litproj(render_data_context& rend_data_ctx, light_proj* litproj, cam_data& cam) { if (!litproj) return false; @@ -1581,53 +1564,53 @@ static bool draw_pass_shadow_litproj(light_proj* litproj) { if (!tex) return false; - litproj->draw_texture.Bind(); - litproj->draw_texture.SetViewport(); - gl_rend_state.enable_depth_test(); + litproj->draw_texture.Bind(rend_data_ctx.state); + litproj->draw_texture.SetViewport(rend_data_ctx.state); + rend_data_ctx.state.enable_depth_test(); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearDepthf(1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - if (!light_proj::set_mat(true)) { - gl_rend_state.bind_framebuffer(0); + if (!light_proj::set_mat(rend_data_ctx, cam, true)) { + rend_data_ctx.state.bind_framebuffer(0); return false; } render_context* rctx = rctx_ptr; - rctx->draw_state->shader_index = SHADER_FT_LITPROJ; - gl_rend_state.active_bind_texture_2d(17, tex->glid); - gl_rend_state.bind_sampler(17, rctx->render_samplers[2]); - gl_rend_state.active_bind_texture_2d(18, litproj->shadow_texture[0].GetColorTex()); - gl_rend_state.bind_sampler(18, rctx->render_samplers[2]); - gl_rend_state.active_texture(0); + rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = SHADER_FT_LITPROJ; + rend_data_ctx.state.active_bind_texture_2d(17, tex->glid); + rend_data_ctx.state.bind_sampler(17, rctx->render_samplers[2]); + rend_data_ctx.state.active_bind_texture_2d(18, litproj->shadow_texture[0].GetColorTex()); + rend_data_ctx.state.bind_sampler(18, rctx->render_samplers[2]); + rend_data_ctx.state.active_texture(0); return true; } -static void draw_pass_sss_contour(render_context* rctx, rndr::Render* rend) { +static void draw_pass_sss_contour(render_data_context& rend_data_ctx, render_context* rctx, rndr::Render* rend) { if (reflect_draw) - rctx->reflect_buffer.Bind(); + rctx->reflect_buffer.Bind(rend_data_ctx.state); else - rend->sss_contour_texture->Bind(); + rend->sss_contour_texture->Bind(rend_data_ctx.state); - gl_rend_state.enable_depth_test(); - gl_rend_state.set_depth_func(GL_ALWAYS); - gl_rend_state.set_depth_mask(GL_TRUE); + rend_data_ctx.state.enable_depth_test(); + rend_data_ctx.state.set_depth_func(GL_ALWAYS); + rend_data_ctx.state.set_depth_mask(GL_TRUE); if (reflect_draw) { RenderTexture& refl_tex = rctx->render_manager->get_render_texture(0); - gl_rend_state.set_viewport(0, 0, refl_tex.GetWidth(), refl_tex.GetHeight()); - gl_rend_state.active_bind_texture_2d(0, refl_tex.GetColorTex()); - gl_rend_state.bind_sampler(0, rctx->render_samplers[1]); - gl_rend_state.active_bind_texture_2d(1, refl_tex.GetDepthTex()); - gl_rend_state.bind_sampler(1, rctx->render_samplers[1]); + rend_data_ctx.state.set_viewport(0, 0, refl_tex.GetWidth(), refl_tex.GetHeight()); + rend_data_ctx.state.active_bind_texture_2d(0, refl_tex.GetColorTex()); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[1]); + rend_data_ctx.state.active_bind_texture_2d(1, refl_tex.GetDepthTex()); + rend_data_ctx.state.bind_sampler(1, rctx->render_samplers[1]); } else { - gl_rend_state.set_viewport(0, 0, rend->render_width[0], rend->render_height[0]); - gl_rend_state.active_bind_texture_2d(0, rend->rend_texture[0].GetColorTex()); - gl_rend_state.bind_sampler(0, rctx->render_samplers[1]); - gl_rend_state.active_bind_texture_2d(1, rend->rend_texture[0].GetDepthTex()); - gl_rend_state.bind_sampler(1, rctx->render_samplers[1]); + rend_data_ctx.state.set_viewport(0, 0, rend->render_width[0], rend->render_height[0]); + rend_data_ctx.state.active_bind_texture_2d(0, rend->rend_texture[0].GetColorTex()); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[1]); + rend_data_ctx.state.active_bind_texture_2d(1, rend->rend_texture[0].GetDepthTex()); + rend_data_ctx.state.bind_sampler(1, rctx->render_samplers[1]); } - gl_rend_state.active_texture(0); + rend_data_ctx.state.active_texture(0); camera* cam = rctx->camera; float_t v3 = 1.0f / tanf(cam->fov * 0.5f * DEG_TO_RAD_FLOAT); @@ -1644,19 +1627,25 @@ static void draw_pass_sss_contour(render_context* rctx, rndr::Render* rend) { contour_coef_shader_data shader_data = {}; shader_data.g_contour = { v9 * 0.004f + 0.0027f, 0.003f, v3 * 0.35f, 0.0008f }; - shader_data.g_near_far = rctx->g_near_far; - rctx->contour_coef_ubo.WriteMemory(shader_data); + const float_t max_distance = rctx->camera->max_distance; + const float_t min_distance = rctx->camera->min_distance; + shader_data.g_near_far = { + (float_t)(max_distance / (max_distance - min_distance)), + (float_t)(-(max_distance * min_distance) / (max_distance - min_distance)), + min_distance, max_distance + }; + rctx->contour_coef_ubo.WriteMemory(rend_data_ctx.state, shader_data); - shaders_ft.set(SHADER_FT_CONTOUR); - rctx->contour_coef_ubo.Bind(2); + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_CONTOUR); + rend_data_ctx.state.bind_uniform_buffer_base(2, rctx->contour_coef_ubo); if (reflect_draw) { RenderTexture& refl_tex = rctx->render_manager->get_render_texture(0); - rctx->render.draw_quad(refl_tex.GetWidth(), refl_tex.GetHeight(), 1.0f, 1.0f, - 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); + rctx->render.draw_quad(rend_data_ctx, refl_tex.GetWidth(), refl_tex.GetHeight(), + 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); } else - rctx->render.draw_quad( + rctx->render.draw_quad(rend_data_ctx, rend->render_post_width[0], rend->render_post_height[0], rend->render_post_width_scale, rend->render_post_height_scale, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); @@ -1700,7 +1689,7 @@ static void draw_pass_sss_filter_calc_coef(double_t step, int32_t size, double_t } } -static void draw_pass_sss_filter(render_context* rctx, sss_data* sss) { +static void draw_pass_sss_filter(render_data_context& rend_data_ctx, render_context* rctx, sss_data* sss) { const int32_t sss_count = 6; vec3 interest = rctx->camera->interest; vec3 view_point = rctx->camera->view_point; @@ -1737,30 +1726,30 @@ static void draw_pass_sss_filter(render_context* rctx, sss_data* sss) { float_t v34 = (float_t)(1.0 / clamp_def(v31 * v29, 0.25f, 100.0f)); if (v34 < 0.145f) v33 = max_def(v34 - 0.02f, 0.0f) * 8.0f * 0.6f; - rctx->set_batch_sss_param({ v33, 0.0f, 0.0f, 0.0f }); + rend_data_ctx.set_batch_sss_param({ v33, 0.0f, 0.0f, 0.0f }); - gl_rend_state.active_texture(0); + rend_data_ctx.state.active_texture(0); if (sss->npr_contour) { - sss->textures[0].Bind(); - gl_rend_state.set_viewport(0, 0, 640, 360); + sss->textures[0].Bind(rend_data_ctx.state); + rend_data_ctx.state.set_viewport(0, 0, 640, 360); rndr::Render* rend = &rctx->render; - uniform_value[U_REDUCE] = 0; - shaders_ft.set(SHADER_FT_REDUCE); + rend_data_ctx.shader_flags.arr[U_REDUCE] = 0; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); RenderTexture& rt = reflect_draw ? rctx->render_manager->get_render_texture(0) : rend->rend_texture[0]; - gl_rend_state.bind_texture_2d(rt.GetColorTex()); - gl_rend_state.bind_sampler(0, rctx->render_samplers[0]); - rctx->render.draw_quad(rt.GetWidth(), rt.GetHeight(), + rend_data_ctx.state.bind_texture_2d(rt.GetColorTex()); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); + rctx->render.draw_quad(rend_data_ctx, rt.GetWidth(), rt.GetHeight(), 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f); } - sss->textures[2].Bind(); - gl_rend_state.set_viewport(0, 0, 320, 180); - uniform_value[U_SSS_FILTER] = 0; - shaders_ft.set(SHADER_FT_SSS_FILT); - gl_rend_state.bind_texture_2d(sss->textures[0].GetColorTex()); - gl_rend_state.bind_sampler(0, rctx->render_samplers[0]); - rctx->render.draw_quad(sss->textures[0].GetWidth(), sss->textures[0].GetHeight(), + sss->textures[2].Bind(rend_data_ctx.state); + rend_data_ctx.state.set_viewport(0, 0, 320, 180); + rend_data_ctx.shader_flags.arr[U_SSS_FILTER] = 0; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_SSS_FILT); + rend_data_ctx.state.bind_texture_2d(sss->textures[0].GetColorTex()); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); + rctx->render.draw_quad(rend_data_ctx, sss->textures[0].GetWidth(), sss->textures[0].GetHeight(), 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f); sss_filter_gaussian_coef_shader_data shader_data = {}; @@ -1772,17 +1761,17 @@ static void draw_pass_sss_filter(render_context* rctx, sss_data* sss) { const double_t a8[] = { 0.3, 0.7, 2.0 }; draw_pass_sss_filter_calc_coef(1.0, sss_count, v34, 3, a5, a6, a7, a8, shader_data.g_coef); - rctx->sss_filter_gaussian_coef_ubo.WriteMemory(shader_data); - sss->textures[reflect_draw ? 3 : 1].Bind(); - gl_rend_state.set_viewport(0, 0, 320, 180); - uniform_value[U_SSS_FILTER] = 3; - shaders_ft.set(SHADER_FT_SSS_FILT); - gl_rend_state.bind_texture_2d(sss->textures[2].GetColorTex()); - gl_rend_state.bind_sampler(0, rctx->render_samplers[0]); - rctx->sss_filter_gaussian_coef_ubo.Bind(1); - rctx->render.draw_quad(sss->textures[2].GetWidth(), sss->textures[2].GetHeight(), + rctx->sss_filter_gaussian_coef_ubo.WriteMemory(rend_data_ctx.state, shader_data); + sss->textures[reflect_draw ? 3 : 1].Bind(rend_data_ctx.state); + rend_data_ctx.state.set_viewport(0, 0, 320, 180); + rend_data_ctx.shader_flags.arr[U_SSS_FILTER] = 3; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_SSS_FILT); + rend_data_ctx.state.bind_texture_2d(sss->textures[2].GetColorTex()); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); + rend_data_ctx.state.bind_uniform_buffer_base(1, rctx->sss_filter_gaussian_coef_ubo); + rctx->render.draw_quad(rend_data_ctx, sss->textures[2].GetWidth(), sss->textures[2].GetHeight(), 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.96f, 1.0f, 0.0f); - gl_rend_state.bind_texture_2d(0); + rend_data_ctx.state.bind_texture_2d(0); } static int32_t draw_pass_3d_get_translucent_count(render_context* rctx) { @@ -1799,32 +1788,32 @@ static int32_t draw_pass_3d_get_translucent_count(render_context* rctx) { return count; } -static void draw_pass_3d_shadow_reset(render_context* rctx) { - gl_rend_state.active_bind_texture_2d(6, rctx->empty_texture_2d->glid); - gl_rend_state.active_bind_texture_2d(7, rctx->empty_texture_2d->glid); - rctx->draw_state->self_shadow = false; - rctx->draw_state->shadow = false; +static void draw_pass_3d_shadow_reset(render_data_context& rend_data_ctx, render_context* rctx) { + rend_data_ctx.state.active_bind_texture_2d(6, rctx->empty_texture_2d->glid); + rend_data_ctx.state.active_bind_texture_2d(7, rctx->empty_texture_2d->glid); + rend_data_ctx.set_self_shadow(false); + rend_data_ctx.set_shadow(false); } -static void draw_pass_3d_shadow_set(Shadow* shad, render_context* rctx) { +static void draw_pass_3d_shadow_set(render_data_context& rend_data_ctx, Shadow* shad, render_context* rctx) { float_t esm_param; if (shad->self_shadow && shad->num_shadow > 0) { - gl_rend_state.active_bind_texture_2d(19, shad->render_textures[3].GetColorTex()); - gl_rend_state.active_bind_texture_2d(20, shad->render_textures[5].GetColorTex()); - gl_rend_state.active_texture(0); + rend_data_ctx.state.active_bind_texture_2d(19, shad->render_textures[3].GetColorTex()); + rend_data_ctx.state.active_bind_texture_2d(20, shad->render_textures[5].GetColorTex()); + rend_data_ctx.state.active_texture(0); esm_param = (shad->field_2D8 * shad->field_208 * 2.0f) * 1.442695f; - rctx->draw_state->self_shadow = true; + rend_data_ctx.set_self_shadow(true); } else { - gl_rend_state.active_bind_texture_2d(19, rctx->empty_texture_2d->glid); - gl_rend_state.active_bind_texture_2d(20, rctx->empty_texture_2d->glid); - gl_rend_state.active_texture(0); + rend_data_ctx.state.active_bind_texture_2d(19, rctx->empty_texture_2d->glid); + rend_data_ctx.state.active_bind_texture_2d(20, rctx->empty_texture_2d->glid); + rend_data_ctx.state.active_texture(0); esm_param = 0.0f; - rctx->draw_state->self_shadow = false; + rend_data_ctx.set_self_shadow(false); } - gl_rend_state.bind_sampler(19, rctx->render_samplers[0]); - gl_rend_state.bind_sampler(20, rctx->render_samplers[0]); + rend_data_ctx.state.bind_sampler(19, rctx->render_samplers[0]); + rend_data_ctx.state.bind_sampler(20, rctx->render_samplers[0]); mat4 mats[2]; mats[0] = mat4_identity; @@ -1832,8 +1821,8 @@ static void draw_pass_3d_shadow_set(Shadow* shad, render_context* rctx) { vec4 shadow_ambient; vec4 shadow_ambient1; if (shad->num_shadow > 0) { - rctx->draw_state->shadow = true; - uniform_value[U_STAGE_SHADOW2] = shad->num_shadow > 1 ? 1 : 0; + rctx->draw_state->rend_data[rend_data_ctx.index].shadow = true; + rend_data_ctx.shader_flags.arr[U_STAGE_SHADOW2] = shad->num_shadow > 1 ? 1 : 0; float_t shadow_range = shad->get_shadow_range(); for (int32_t i = 0; i < 2; i++) { @@ -1870,13 +1859,13 @@ static void draw_pass_3d_shadow_set(Shadow* shad, render_context* rctx) { int32_t j = 0; for (int32_t i = 0; i < 2; i++) if (shad->shadow_enable[i]) { - gl_rend_state.active_bind_texture_2d(6 + j, shad->curr_render_textures[1 + i]->GetColorTex()); + rend_data_ctx.state.active_bind_texture_2d(6 + j, shad->curr_render_textures[1 + i]->GetColorTex()); j++; } for (; j < 2; j++) - gl_rend_state.active_bind_texture_2d(6 + j, rctx->empty_texture_2d->glid); - gl_rend_state.active_texture(0); + rend_data_ctx.state.active_bind_texture_2d(6 + j, rctx->empty_texture_2d->glid); + rend_data_ctx.state.active_texture(0); light_set* set = &rctx->light_set[LIGHT_SET_MAIN]; light_data* data = &set->lights[LIGHT_SHADOW]; @@ -1891,24 +1880,24 @@ static void draw_pass_3d_shadow_set(Shadow* shad, render_context* rctx) { shadow_ambient1 = { 1.0f - ambient.x, 1.0f - ambient.y, 1.0f - ambient.z, 0.0f }; } else { - rctx->draw_state->shadow = false; + rctx->draw_state->rend_data[rend_data_ctx.index].shadow = false; for (int32_t i = 0; i < 2; i++) - gl_rend_state.active_bind_texture_2d(6 + i, shad->curr_render_textures[1 + i]->GetColorTex()); - gl_rend_state.active_texture(0); + rend_data_ctx.state.active_bind_texture_2d(6 + i, shad->curr_render_textures[1 + i]->GetColorTex()); + rend_data_ctx.state.active_texture(0); shadow_ambient = 1.0f; shadow_ambient1 = 0.0f; } - rctx->set_scene_shadow_params(esm_param, mats, shadow_ambient, shadow_ambient1); + rend_data_ctx.set_scene_shadow_params(esm_param, mats, shadow_ambient, shadow_ambient1); - gl_rend_state.bind_sampler(6, 0); - gl_rend_state.bind_sampler(7, 0); + rend_data_ctx.state.bind_sampler(6, 0); + rend_data_ctx.state.bind_sampler(7, 0); } -static void draw_pass_3d_translucent(render_context* rctx, mdl::ObjType opaque, - mdl::ObjType transparent, mdl::ObjType translucent) { +static void draw_pass_3d_translucent(render_data_context& rend_data_ctx, + render_context* rctx, mdl::ObjType opaque, mdl::ObjType transparent, mdl::ObjType translucent, cam_data& cam) { if (rctx->disp_manager->get_obj_count(opaque) < 1 && rctx->disp_manager->get_obj_count(transparent) < 1 && rctx->disp_manager->get_obj_count(translucent) < 1) @@ -1918,31 +1907,33 @@ static void draw_pass_3d_translucent(render_context* rctx, mdl::ObjType opaque, int32_t alpha_array[256]; int32_t count = draw_pass_3d_translucent_count_layers(rctx, - alpha_array, opaque, transparent, translucent); + alpha_array, opaque, transparent, translucent, cam); for (int32_t i = 0; i < count; i++) { int32_t alpha = alpha_array[i]; - rend->transparency_copy(); - if (rctx->render_manager->draw_pass_3d[DRAW_PASS_3D_OPAQUE] && rctx->disp_manager->get_obj_count(opaque)) - rctx->disp_manager->draw(opaque, 0, true, alpha); - if (rctx->render_manager->draw_pass_3d[DRAW_PASS_3D_TRANSPARENT] && rctx->disp_manager->get_obj_count(transparent)) - rctx->disp_manager->draw(transparent, 0, true, alpha); - if (rctx->render_manager->draw_pass_3d[DRAW_PASS_3D_TRANSLUCENT] && rctx->disp_manager->get_obj_count(translucent)) { - gl_rend_state.enable_blend(); - rctx->disp_manager->draw(translucent, 0, true, alpha); - gl_rend_state.disable_blend(); + rend->transparency_copy(rend_data_ctx); + if (rctx->render_manager->draw_pass_3d[DRAW_PASS_3D_OPAQUE] + && rctx->disp_manager->get_obj_count(opaque)) + rctx->disp_manager->draw(rend_data_ctx, opaque, cam, 0, true, alpha); + if (rctx->render_manager->draw_pass_3d[DRAW_PASS_3D_TRANSPARENT] + && rctx->disp_manager->get_obj_count(transparent)) + rctx->disp_manager->draw(rend_data_ctx, transparent, cam, 0, true, alpha); + if (rctx->render_manager->draw_pass_3d[DRAW_PASS_3D_TRANSLUCENT] + && rctx->disp_manager->get_obj_count(translucent)) { + rend_data_ctx.state.enable_blend(); + rctx->disp_manager->draw(rend_data_ctx, translucent, cam, 0, true, alpha); + rend_data_ctx.state.disable_blend(); } - rend->transparency_combine((float_t)alpha * (float_t)(1.0 / 255.0)); + rend->transparency_combine(rend_data_ctx, (float_t)alpha * (float_t)(1.0 / 255.0)); } } static int32_t draw_pass_3d_translucent_count_layers(render_context* rctx, - int32_t* alpha_array, mdl::ObjType opaque, - mdl::ObjType transparent, mdl::ObjType translucent) { + int32_t* alpha_array, mdl::ObjType opaque, mdl::ObjType transparent, mdl::ObjType translucent, cam_data& cam) { bool arr[0x100] = { false }; - draw_pass_3d_translucent_has_objects(rctx, arr, opaque); - draw_pass_3d_translucent_has_objects(rctx, arr, transparent); - draw_pass_3d_translucent_has_objects(rctx, arr, translucent); + draw_pass_3d_translucent_has_objects(rctx, arr, opaque, cam); + draw_pass_3d_translucent_has_objects(rctx, arr, transparent, cam); + draw_pass_3d_translucent_has_objects(rctx, arr, translucent, cam); int32_t count = 0; for (int32_t i = 0xFF; i >= 0; i--) @@ -1953,8 +1944,8 @@ static int32_t draw_pass_3d_translucent_count_layers(render_context* rctx, return count; } -static void draw_pass_3d_translucent_has_objects(render_context* rctx, bool* arr, mdl::ObjType type) { - rctx->disp_manager->calc_obj_radius(&rctx->view_mat, type); +static void draw_pass_3d_translucent_has_objects(render_context* rctx, bool* arr, mdl::ObjType type, cam_data& cam) { + rctx->disp_manager->calc_obj_radius(cam, type); mdl::ObjList& vec = rctx->disp_manager->obj[type]; for (mdl::ObjData*& i : vec) switch (i->kind) { @@ -1973,29 +1964,28 @@ static void draw_pass_3d_translucent_has_objects(render_context* rctx, bool* arr } } -static void draw_pass_reflect_full(rndr::RenderManager* render_manager) { +static void draw_pass_reflect_full(render_data_context& rend_data_ctx, rndr::RenderManager* render_manager) { render_context* rctx = rctx_ptr; - gl_rend_state.begin_event("pass_reflect"); + rend_data_ctx.state.begin_event("pass_reflect"); RenderTexture& refl_tex = render_manager->get_render_texture(0); RenderTexture& refl_buf_tex = rctx->reflect_buffer; - refl_tex.Bind(); + refl_tex.Bind(rend_data_ctx.state); extern bool reflect_full; if (rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFLECT_OPAQUE) || rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFLECT_TRANSPARENT) || rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFLECT_TRANSLUCENT_SORT_BY_RADIUS) || rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFLECT_TRANSLUCENT)) { - refl_tex.SetViewport(); + refl_tex.SetViewport(rend_data_ctx.state); - draw_pass_set_camera(); if (!rctx->sss_data->enable || !rctx->sss_data->npr_contour) glClear(GL_DEPTH_BUFFER_BIT); - gl_rend_state.set_depth_func(GL_LEQUAL); + rend_data_ctx.state.set_depth_func(GL_LEQUAL); for (int32_t i = LIGHT_SET_MAIN; i < LIGHT_SET_MAX; i++) - rctx->light_set[i].data_set(rctx->face, (light_set_id)i); + rctx->light_set[i].data_set(rend_data_ctx, rctx->face, (light_set_id)i); for (int32_t i = FOG_DEPTH; i < FOG_BUMP; i++) - rctx->fog[i].data_set((fog_id)i); + rctx->fog[i].data_set(rend_data_ctx, (fog_id)i); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); if (rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_SSS)) @@ -2003,121 +1993,123 @@ static void draw_pass_reflect_full(rndr::RenderManager* render_manager) { else glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - gl_rend_state.enable_depth_test(); - gl_rend_state.set_depth_func(GL_LEQUAL); - gl_rend_state.set_depth_mask(GL_TRUE); - gl_rend_state.set_cull_face_mode(GL_FRONT); + rend_data_ctx.state.enable_depth_test(); + rend_data_ctx.state.set_depth_func(GL_LEQUAL); + rend_data_ctx.state.set_depth_mask(GL_TRUE); + rend_data_ctx.state.set_cull_face_mode(GL_FRONT); reflect_draw = true; - rctx->draw_state->shader_index = -1; + rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = -1; int32_t render_width = refl_tex.GetWidth(); int32_t render_height = refl_tex.GetHeight(); - rctx->set_scene_framebuffer_size(render_width, render_height, render_width, render_height); + rend_data_ctx.set_scene_framebuffer_size(render_width, render_height, render_width, render_height); if (render_manager->shadow) - draw_pass_3d_shadow_set(render_manager->shadow_ptr, rctx); + draw_pass_3d_shadow_set(rend_data_ctx, render_manager->shadow_ptr, rctx); else - draw_pass_3d_shadow_reset(rctx); + draw_pass_3d_shadow_reset(rend_data_ctx, rctx); if (render_manager->effect_texture) - gl_rend_state.active_bind_texture_2d(14, render_manager->effect_texture->glid); + rend_data_ctx.state.active_bind_texture_2d(14, render_manager->effect_texture->glid); else - gl_rend_state.active_bind_texture_2d(14, rctx->empty_texture_2d->glid); + rend_data_ctx.state.active_bind_texture_2d(14, rctx->empty_texture_2d->glid); - uniform_value[U_WATER_REFLECT] = 0; + rend_data_ctx.shader_flags.arr[U_WATER_REFLECT] = 0; - rctx->sss_data->set_texture(3); + rctx->sss_data->set_texture(rend_data_ctx.state, 3); - gl_rend_state.bind_sampler(14, rctx->render_samplers[0]); - gl_rend_state.bind_sampler(15, rctx->render_samplers[0]); - gl_rend_state.bind_sampler(16, rctx->render_samplers[0]); + rend_data_ctx.state.bind_sampler(14, rctx->render_samplers[0]); + rend_data_ctx.state.bind_sampler(15, rctx->render_samplers[0]); + rend_data_ctx.state.bind_sampler(16, rctx->render_samplers[0]); - uniform_value[U_STAGE_AMBIENT] = render_manager->light_stage_ambient ? 1 : 0; + rend_data_ctx.shader_flags.arr[U_STAGE_AMBIENT] = render_manager->light_stage_ambient ? 1 : 0; - set_reflect_mat(rctx); + cam_data cam = render_manager->cam; + set_reflect_mat(rend_data_ctx, cam); + rend_data_ctx.set_batch_scene_camera(cam); if (render_manager->alpha_z_sort) { - rctx->disp_manager->obj_sort(&rctx->view_mat, - mdl::OBJ_TYPE_REFLECT_TRANSLUCENT, 1, render_manager->field_31F); - rctx->disp_manager->obj_sort(&rctx->view_mat, - mdl::OBJ_TYPE_REFLECT_TRANSLUCENT_SORT_BY_RADIUS, 2); + rctx->disp_manager->obj_sort(rend_data_ctx, + mdl::OBJ_TYPE_REFLECT_TRANSLUCENT, 1, cam, render_manager->field_31F); + rctx->disp_manager->obj_sort(rend_data_ctx, + mdl::OBJ_TYPE_REFLECT_TRANSLUCENT_SORT_BY_RADIUS, 2, cam); } if (render_manager->opaque_z_sort) - rctx->disp_manager->obj_sort(&rctx->view_mat, mdl::OBJ_TYPE_REFLECT_OPAQUE, 0); + rctx->disp_manager->obj_sort(rend_data_ctx, mdl::OBJ_TYPE_REFLECT_OPAQUE, 0, cam); if (render_manager->draw_pass_3d[DRAW_PASS_3D_OPAQUE]) { - gl_rend_state.enable_depth_test(); - gl_rend_state.set_depth_mask(GL_TRUE); - rctx->disp_manager->draw(mdl::OBJ_TYPE_REFLECT_OPAQUE); - gl_rend_state.disable_depth_test(); + rend_data_ctx.state.enable_depth_test(); + rend_data_ctx.state.set_depth_mask(GL_TRUE); + rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_REFLECT_OPAQUE, cam); + rend_data_ctx.state.disable_depth_test(); } - Glitter::glt_particle_manager->DispScenes(Glitter::DISP_OPAQUE); + Glitter::glt_particle_manager->DispScenes(rend_data_ctx, Glitter::DISP_OPAQUE); - gl_rend_state.enable_depth_test(); - gl_rend_state.set_depth_mask(GL_TRUE); + rend_data_ctx.state.enable_depth_test(); + rend_data_ctx.state.set_depth_mask(GL_TRUE); if (render_manager->draw_pass_3d[DRAW_PASS_3D_TRANSPARENT]) { - gl_rend_state.set_cull_face_mode(GL_FRONT); - rctx->disp_manager->draw(mdl::OBJ_TYPE_REFLECT_TRANSPARENT); + rend_data_ctx.state.set_cull_face_mode(GL_FRONT); + rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_REFLECT_TRANSPARENT, cam); } if (render_manager->npr_param == 1) - render_manager->pass_3d_contour(); + render_manager->pass_3d_contour(rend_data_ctx); - gl_rend_state.disable_depth_test(); + rend_data_ctx.state.disable_depth_test(); - gl_rend_state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); - Glitter::glt_particle_manager->DispScenes(Glitter::DISP_ALPHA); - gl_rend_state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); + Glitter::glt_particle_manager->DispScenes(rend_data_ctx, Glitter::DISP_ALPHA); + rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); /*if (npr_param == 1) { - gl_rend_state.set_color_mask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE); + rend_data_ctx.state.set_color_mask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT); - gl_rend_state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); }*/ - gl_rend_state.enable_depth_test(); + rend_data_ctx.state.enable_depth_test(); if (render_manager->draw_pass_3d[DRAW_PASS_3D_TRANSLUCENT]) { - gl_rend_state.enable_blend(); - gl_rend_state.set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - gl_rend_state.set_depth_mask(GL_FALSE); - gl_rend_state.set_cull_face_mode(GL_FRONT); - rctx->disp_manager->draw(mdl::OBJ_TYPE_REFLECT_TRANSLUCENT_SORT_BY_RADIUS); - rctx->disp_manager->draw(mdl::OBJ_TYPE_REFLECT_TRANSLUCENT); - gl_rend_state.disable_blend(); + rend_data_ctx.state.enable_blend(); + rend_data_ctx.state.set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + rend_data_ctx.state.set_depth_mask(GL_FALSE); + rend_data_ctx.state.set_cull_face_mode(GL_FRONT); + rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_REFLECT_TRANSLUCENT_SORT_BY_RADIUS, cam); + rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_REFLECT_TRANSLUCENT, cam); + rend_data_ctx.state.disable_blend(); } - gl_rend_state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); // X - Glitter::glt_particle_manager->DispScenes(Glitter::DISP_TYPE_2); - gl_rend_state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - gl_rend_state.disable_depth_test(); + rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); // X + Glitter::glt_particle_manager->DispScenes(rend_data_ctx, Glitter::DISP_TYPE_2); + rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + rend_data_ctx.state.disable_depth_test(); - gl_rend_state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); - Glitter::glt_particle_manager->DispScenes(Glitter::DISP_NORMAL); - gl_rend_state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); + Glitter::glt_particle_manager->DispScenes(rend_data_ctx, Glitter::DISP_NORMAL); + rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - gl_rend_state.active_bind_texture_2d(14, 0); - gl_rend_state.active_bind_texture_2d(15, 0); + rend_data_ctx.state.active_bind_texture_2d(14, 0); + rend_data_ctx.state.active_bind_texture_2d(15, 0); if (render_manager->shadow) - draw_pass_3d_shadow_reset(rctx); + draw_pass_3d_shadow_reset(rend_data_ctx, rctx); rndr::Render* render = render_manager->render; - rctx->set_scene_framebuffer_size(render->render_width[0], + rend_data_ctx.set_scene_framebuffer_size(render->render_width[0], render->render_height[0], render->render_width[0], render->render_height[0]); reflect_draw = false; - gl_rend_state.set_cull_face_mode(GL_BACK); - gl_rend_state.disable_depth_test(); + rend_data_ctx.state.set_cull_face_mode(GL_BACK); + rend_data_ctx.state.disable_depth_test(); for (int32_t i = render_manager->reflect_blur_num, j = 0; i > 0; i--, j++) { - blur_filter_apply(rctx, &refl_buf_tex, &refl_tex, + blur_filter_apply(rend_data_ctx, rctx, &refl_buf_tex, &refl_tex, render_manager->reflect_blur_filter, 1.0f, 1.0f, 0.0f); - image_filter_scale(&refl_tex, refl_buf_tex.color_texture); + image_filter_scale(rend_data_ctx, &refl_tex, refl_buf_tex.color_texture); } } else { @@ -2127,27 +2119,28 @@ static void draw_pass_reflect_full(rndr::RenderManager* render_manager) { glClear(GL_COLOR_BUFFER_BIT); glClearColor(clear_color.x, clear_color.y, clear_color.z, clear_color.w); } - shader::unbind(); - gl_rend_state.bind_framebuffer(0); - gl_rend_state.end_event(); + shader::unbind(rend_data_ctx.state); + rend_data_ctx.state.bind_framebuffer(0); + rend_data_ctx.state.end_event(); } -static void blur_filter_apply(render_context* rctx, RenderTexture* dst, RenderTexture* src, +static void blur_filter_apply(render_data_context& rend_data_ctx, + render_context* rctx, RenderTexture* dst, RenderTexture* src, blur_filter_mode filter, const vec2 res_scale, const vec4 scale, const vec4 offset) { if (!dst || !src) return; - gl_rend_state.begin_event("`anonymous-namespace'::Impl::apply_blur_filter_sub"); + rend_data_ctx.state.begin_event("`anonymous-namespace'::Impl::apply_blur_filter_sub"); - dst->Bind(); - dst->SetViewport(); + dst->Bind(rend_data_ctx.state); + dst->SetViewport(rend_data_ctx.state); filter_scene_shader_data filter_scene = {}; float_t w = res_scale.x / (float_t)src->GetWidth(); float_t h = res_scale.y / (float_t)src->GetHeight(); filter_scene.g_transform = { w, h, 0.0f, 0.0f }; filter_scene.g_texcoord = { 1.0f, 1.0f, 0.0f, 0.0f }; - rctx->filter_scene_ubo.WriteMemory(filter_scene); + rctx->filter_scene_ubo.WriteMemory(rend_data_ctx.state, filter_scene); imgfilter_batch_shader_data imgfilter_batch = {}; if (filter == BLUR_FILTER_32) @@ -2156,17 +2149,17 @@ static void blur_filter_apply(render_context* rctx, RenderTexture* dst, RenderTe imgfilter_batch.g_color_scale = scale * (float_t)(1.0 / 4.0); imgfilter_batch.g_color_offset = offset; imgfilter_batch.g_texture_lod = 0.0f; - rctx->imgfilter_batch_ubo.WriteMemory(imgfilter_batch); + rctx->imgfilter_batch_ubo.WriteMemory(rend_data_ctx.state, imgfilter_batch); - uniform_value[U_IMAGE_FILTER] = filter == BLUR_FILTER_32 ? 1 : 0; - gl_rend_state.bind_vertex_array(rctx->box_vao); - shaders_ft.set(SHADER_FT_IMGFILT); - rctx->filter_scene_ubo.Bind(0); - rctx->imgfilter_batch_ubo.Bind(1); - gl_rend_state.active_bind_texture_2d(0, src->GetColorTex()); - gl_rend_state.bind_sampler(0, rctx->render_samplers[0]); - shaders_ft.draw_arrays(GL_TRIANGLE_STRIP, (GLint)(filter * 4LL), 4); - gl_rend_state.end_event(); + rend_data_ctx.shader_flags.arr[U_IMAGE_FILTER] = filter == BLUR_FILTER_32 ? 1 : 0; + rend_data_ctx.state.bind_vertex_array(rctx->box_vao); + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_IMGFILT); + rend_data_ctx.state.bind_uniform_buffer_base(0, rctx->filter_scene_ubo); + rend_data_ctx.state.bind_uniform_buffer_base(1, rctx->imgfilter_batch_ubo); + rend_data_ctx.state.active_bind_texture_2d(0, src->GetColorTex()); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); + rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, (GLint)(filter * 4LL), 4); + rend_data_ctx.state.end_event(); } static void render_manager_free_render_textures() { @@ -2198,7 +2191,7 @@ static void render_manager_init_render_textures(int32_t multisample) { glGenFramebuffers(1, &render_manager.multisample_framebuffer); glGenRenderbuffers(1, &render_manager.multisample_renderbuffer); - gl_rend_state.bind_framebuffer(render_manager.multisample_framebuffer); + gl_state.bind_framebuffer(render_manager.multisample_framebuffer); glBindRenderbuffer(GL_RENDERBUFFER, render_manager.multisample_renderbuffer); glRenderbufferStorageMultisample(GL_RENDERBUFFER, 8, GL_RGBA8, render_manager.width, render_manager.height); @@ -2206,7 +2199,7 @@ static void render_manager_init_render_textures(int32_t multisample) { GL_RENDERBUFFER, render_manager.multisample_renderbuffer); glDrawBuffer(GL_COLOR_ATTACHMENT0); glReadBuffer(GL_COLOR_ATTACHMENT0); - gl_rend_state.bind_framebuffer(0); + gl_state.bind_framebuffer(0); glBindRenderbuffer(GL_RENDERBUFFER, 0); if (glGetError()) { @@ -2226,16 +2219,16 @@ static void render_manager_init_render_textures(int32_t multisample) { RenderTexture& rt = render_manager.render_textures[i]; rt.Init(tex_data->width, tex_data->height, tex_data->max_level, tex_data->color_format, tex_data->depth_format); - rt.Bind(); + rt.Bind(gl_state); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } - gl_rend_state.bind_framebuffer(0); + gl_state.bind_framebuffer(0); } -static void set_reflect_mat(render_context* rctx) { - const vec3 clip_plane = *(vec3*)&rctx->data.buffer_scene_data.g_clip_plane; - const vec4 temp = 2.0f * rctx->data.buffer_scene_data.g_clip_plane; +static void set_reflect_mat(render_data_context& rend_data_ctx, cam_data& cam) { + const vec3 clip_plane = *(vec3*)&rend_data_ctx.data.buffer_scene_data.g_clip_plane; + const vec4 temp = 2.0f * rend_data_ctx.data.buffer_scene_data.g_clip_plane; reflect_mat = mat4_identity; *(vec3*)&reflect_mat.row0 -= temp.x * clip_plane; @@ -2247,13 +2240,10 @@ static void set_reflect_mat(render_context* rctx) { reflect_mat.row2.w = 0.0f; reflect_mat.row3.w = 1.0f; - camera* cam = rctx->camera; - mat4_mul(&reflect_mat, &cam->view, &rctx->view_mat); - rctx->proj_mat = cam->projection; - mat4_mul(&rctx->view_mat, &rctx->proj_mat, &rctx->vp_mat); + mat4_mul(&reflect_mat, &cam.view_mat, &cam.view_mat); + cam.calc_view_proj_mat(); - vec3 view_point; - cam->get_view_point(view_point); + vec3 view_point = cam.get_view_point(); mat4_transform_point(&reflect_mat, &view_point, &view_point); - rctx->set_scene_projection_view(rctx->view_mat, rctx->proj_mat, view_point); + cam.set_view_point(view_point); } diff --git a/src/CRE/render_manager.hpp b/src/CRE/render_manager.hpp index 8d1f4fa1..b5c4bb25 100644 --- a/src/CRE/render_manager.hpp +++ b/src/CRE/render_manager.hpp @@ -19,7 +19,8 @@ enum reflect_refract_resolution_mode { REFLECT_REFRACT_RESOLUTION_MAX, }; -typedef void(*draw_pre_process_func)(void*); +typedef void(*draw_pre_process_func)(struct render_data_context& rend_data_ctx, + void* data, const struct cam_data& cam); struct draw_pre_process { int32_t type; @@ -27,6 +28,8 @@ struct draw_pre_process { void* data; }; +struct render_data_context; + namespace rndr { enum RenderPassID { RND_PASSID_SHADOW = 0, @@ -88,6 +91,7 @@ namespace rndr { bool field_31F; bool light_stage_ambient; bool npr; + cam_data cam; RenderManager(); ~RenderManager(); @@ -115,33 +119,32 @@ namespace rndr { void render_all(); void rndpass_post_proc(); - void rndpass_pre_proc(struct camera* cam); + void rndpass_pre_proc(); - void render_single_pass(rndr::RenderPassID id); + void render_single_pass(render_data_context& rend_data_ctx, rndr::RenderPassID id); void render_pass_begin(); void render_pass_end(rndr::RenderPassID id); - void pass_shadow(); - void pass_ss_sss(); - void pass_reflect(); - void pass_refract(); - void pass_pre_process(); - void pass_clear(); - void pass_pre_sprite(); - void pass_3d(); - void pass_show_vector(); - void pass_post_process(); - void pass_sprite(); + void pass_shadow(render_data_context& rend_data_ctx); + void pass_ss_sss(render_data_context& rend_data_ctx); + void pass_reflect(render_data_context& rend_data_ctx); + void pass_refract(render_data_context& rend_data_ctx); + void pass_pre_process(render_data_context& rend_data_ctx); + void pass_clear(render_data_context& rend_data_ctx); + void pass_pre_sprite(render_data_context& rend_data_ctx); + void pass_3d(render_data_context& rend_data_ctx); + void pass_show_vector(render_data_context& rend_data_ctx); + void pass_post_process(render_data_context& rend_data_ctx); + void pass_sprite(render_data_context& rend_data_ctx); - void pass_3d_contour(); - void pass_sprite_surf(); + void pass_3d_contour(render_data_context& rend_data_ctx); + void pass_sprite_surf(render_data_context& rend_data_ctx); }; } -extern void image_filter_scale(RenderTexture* dst, texture* src, const vec4& scale = 1.0f); - -extern void draw_pass_set_camera(); +extern void image_filter_scale(render_data_context& rend_data_ctx, + RenderTexture* dst, texture* src, const vec4& scale = 1.0f); extern void render_manager_init_data(int32_t ssaa, int32_t hd_res, int32_t ss_alpha_mask, bool npr); extern void render_manager_free_data(); diff --git a/src/CRE/render_texture.cpp b/src/CRE/render_texture.cpp index aeb0b140..a381f915 100644 --- a/src/CRE/render_texture.cpp +++ b/src/CRE/render_texture.cpp @@ -4,11 +4,10 @@ */ #include "render_texture.hpp" -#include "render_context.hpp" +#include "gl_rend_state.hpp" +#include "gl_state.hpp" #include "texture.hpp" -extern render_context* rctx_ptr; - static uint32_t render_texture_counter; static int32_t render_texture_init_framebuffer(RenderTexture* rt, int32_t max_level); @@ -24,11 +23,23 @@ RenderTexture::~RenderTexture() { Free(); } -int32_t RenderTexture::Bind(int32_t index) { +int32_t RenderTexture::Bind(gl_state_struct& gl_st, int32_t index) { if (index < 0 || index > max_level) return -1; - gl_rend_state.bind_framebuffer(fbos[index]); + gl_st.bind_framebuffer(fbos[index]); + if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) + return -1; + + gl_get_error_print(); + return 0; +} + +int32_t RenderTexture::Bind(p_gl_rend_state& p_gl_rend_st, int32_t index) { + if (index < 0 || index > max_level) + return -1; + + p_gl_rend_st.bind_framebuffer(fbos[index]); if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) return -1; @@ -85,10 +96,10 @@ int32_t RenderTexture::Init(int32_t width, int32_t height, render_texture_counter++; color_texture = GetColorTex(); if (color_format == GL_RGBA32F) { - glBindTexture(GL_TEXTURE_2D, color_texture); + gl_state.bind_texture_2d(color_texture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glBindTexture(GL_TEXTURE_2D, 0); + gl_state.bind_texture_2d(0); } } else { @@ -122,23 +133,25 @@ int32_t RenderTexture::Init(int32_t width, int32_t height, return 0; } -/*int32_t RenderTexture::InitDepthRenderbuffer(GLenum internal_format, int32_t width, int32_t height) { - gl_rend_state.bind_framebuffer(fbos[0]); +/*int32_t RenderTexture::InitDepthRenderbuffer(gl_state_struct& gl_st, + GLenum internal_format, int32_t width, int32_t height) { + gl_st.bind_framebuffer(fbos[0]); glGenRenderbuffers(1, &depth_rbo); glBindRenderbuffer(GL_RENDERBUFFER, depth_rbo); glRenderbufferStorage(GL_RENDERBUFFER, internal_format, width, height); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth_rbo); - gl_rend_state.bind_framebuffer(0); + gl_st.bind_framebuffer(0); return -(glGetError() != GL_ZERO); } -int32_t RenderTexture::InitStencilRenderbuffer(GLenum internal_format, int32_t width, int32_t height) { - gl_rend_state.bind_framebuffer(fbos[0]); +int32_t RenderTexture::InitStencilRenderbuffer(gl_state_struct& gl_st, + GLenum internal_format, int32_t width, int32_t height) { + gl_st.bind_framebuffer(fbos[0]); glGenRenderbuffers(1, &stencil_rbo); glBindRenderbuffer(GL_RENDERBUFFER, stencil_rbo); glRenderbufferStorage(GL_RENDERBUFFER, internal_format, width, height); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, stencil_rbo); - gl_rend_state.bind_framebuffer(0); + gl_st.bind_framebuffer(0); return -(glGetError() != GL_ZERO); }*/ @@ -152,6 +165,10 @@ int32_t RenderTexture::SetColorDepthTextures(GLuint color_texture, return error; } +void RenderTexture::SetViewport(p_gl_rend_state& p_gl_rend_st) { + p_gl_rend_st.set_viewport(0, 0, GetWidth(), GetHeight()); +} + void render_texture_counter_reset() { render_texture_counter = 0; } @@ -167,7 +184,7 @@ static int32_t render_texture_set_framebuffer_texture(RenderTexture* rt, if (level < 0 || level > rt->max_level) return -1; - gl_rend_state.bind_framebuffer(rt->fbos[level]); + gl_state.bind_framebuffer(rt->fbos[level]); gl_get_error_print(); if (color_texture) { @@ -200,7 +217,7 @@ static int32_t render_texture_set_framebuffer_texture(RenderTexture* rt, int32_t ret = 0; if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) ret = -1; - gl_rend_state.bind_framebuffer(0); + gl_state.bind_framebuffer(0); gl_get_error_print(); return ret; } diff --git a/src/CRE/render_texture.hpp b/src/CRE/render_texture.hpp index 8940659a..abce9ff3 100644 --- a/src/CRE/render_texture.hpp +++ b/src/CRE/render_texture.hpp @@ -6,7 +6,6 @@ #pragma once #include "shared.hpp" -#include "gl_rend_state.hpp" #include "texture.hpp" struct RenderTexture { @@ -21,14 +20,16 @@ struct RenderTexture { RenderTexture(); virtual ~RenderTexture(); - int32_t Bind(int32_t index = 0); + int32_t Bind(struct gl_state_struct& gl_st, int32_t index = 0); + int32_t Bind(struct p_gl_rend_state& p_gl_rend_st, int32_t index = 0); void Free(); int32_t Init(int32_t width, int32_t height, int32_t max_level, GLenum color_format, GLenum depth_format); - /*int32_t InitDepthRenderbuffer(GLenum internal_format, int32_t width, int32_t height); - int32_t InitStencilRenderbuffer(GLenum internal_format, int32_t width, int32_t height);*/ + /*int32_t InitDepthRenderbuffer(gl_state_struct& gl_st, GLenum internal_format, int32_t width, int32_t height); + int32_t InitStencilRenderbuffer(gl_state_struct& gl_st, GLenum internal_format, int32_t width, int32_t height);*/ int32_t SetColorDepthTextures(GLuint color_texture, int32_t max_level = 0, GLuint depth_texture = 0, bool stencil = false); + void SetViewport(struct p_gl_rend_state& p_gl_rend_st); inline GLuint GetColorTex() { return color_texture->glid; @@ -45,10 +46,6 @@ struct RenderTexture { inline int32_t GetWidth() { return color_texture->width; }; - - inline void SetViewport() { - gl_rend_state.set_viewport(0, 0, GetWidth(), GetHeight()); - }; }; extern void render_texture_counter_reset(); diff --git a/src/CRE/renderer/dof.cpp b/src/CRE/renderer/dof.cpp index 1c249a8d..4674e966 100644 --- a/src/CRE/renderer/dof.cpp +++ b/src/CRE/renderer/dof.cpp @@ -6,6 +6,7 @@ #include "dof.hpp" #include "../rob/rob.hpp" #include "../gl_rend_state.hpp" +#include "../gl_state.hpp" #include "../shader_ft.hpp" struct dof_common_shader_data { @@ -60,7 +61,7 @@ namespace renderer { } - void DOF3::apply(RenderTexture* rt, RenderTexture* buf_rt) { + void DOF3::apply(render_data_context& rend_data_ctx, RenderTexture* rt, RenderTexture* buf_rt) { camera* cam = rctx_ptr->camera; bool use_dof_f2 = false; if (dof_debug_data.flags & DOF_DEBUG_USE_UI_PARAMS) { @@ -89,13 +90,13 @@ namespace renderer { } focus = max_def(focus, (float_t)cam->min_distance); - apply_physical(rt, buf_rt, rt->GetColorTex(), rt->GetDepthTex(), + apply_physical(rend_data_ctx, rt, buf_rt, rt->GetColorTex(), rt->GetDepthTex(), cam->min_distance, cam->max_distance, focus, dof_debug_data.focal_length, cam->fov * DEG_TO_RAD_FLOAT, dof_debug_data.f_number); } else { float_t fuzzing_range = max_def(dof_debug_data.f2.fuzzing_range, 0.01f); - apply_f2(rt, buf_rt, rt->GetColorTex(), rt->GetDepthTex(), + apply_f2(rend_data_ctx, rt, buf_rt, rt->GetColorTex(), rt->GetDepthTex(), cam->min_distance, cam->max_distance, cam->fov * DEG_TO_RAD_FLOAT, dof_debug_data.f2.focus, dof_debug_data.f2.focus_range, fuzzing_range, dof_debug_data.f2.ratio); @@ -105,7 +106,7 @@ namespace renderer { } else if (dof_pv_data.enable && dof_pv_data.f2.ratio > 0.0f) { float_t fuzzing_range = max_def(dof_pv_data.f2.fuzzing_range, 0.01f); - apply_f2(rt, buf_rt, rt->GetColorTex(), rt->GetDepthTex(), + apply_f2(rend_data_ctx, rt, buf_rt, rt->GetColorTex(), rt->GetDepthTex(), cam->min_distance, cam->max_distance, cam->fov * DEG_TO_RAD_FLOAT, dof_pv_data.f2.focus, dof_pv_data.f2.focus_range, fuzzing_range, dof_pv_data.f2.ratio); @@ -164,149 +165,153 @@ namespace renderer { glSamplerParameteri(samplers[1], GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glSamplerParameteri(samplers[1], GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - common_ubo.Create(sizeof(dof_common_shader_data)); + common_ubo.Create(gl_state, sizeof(dof_common_shader_data)); vec2 data[50] = {}; renderer::DOF3::calculate_texcoords(data, 3.0f); - texcoords_ubo.Create(sizeof(data), data); + texcoords_ubo.Create(gl_state, sizeof(data), data); glGenVertexArrays(1, &vao); } - void DOF3::apply_f2(RenderTexture* rt, RenderTexture* buf_rt, GLuint color_texture, + void DOF3::apply_f2(render_data_context& rend_data_ctx, + RenderTexture* rt, RenderTexture* buf_rt, GLuint color_texture, GLuint depth_texture, float_t min_distance, float_t max_distance, float_t fov, float_t focus, float_t focus_range, float_t fuzzing_range, float_t ratio) { - gl_rend_state.begin_event("renderer::DOF3::apply_f2"); - gl_rend_state.disable_blend(); - gl_rend_state.set_depth_mask(GL_FALSE); - gl_rend_state.set_depth_func(GL_ALWAYS); - update_data(min_distance, max_distance, + rend_data_ctx.state.begin_event("renderer::DOF3::apply_f2"); + rend_data_ctx.state.disable_blend(); + rend_data_ctx.state.set_depth_mask(GL_FALSE); + rend_data_ctx.state.set_depth_func(GL_ALWAYS); + update_data(rend_data_ctx, min_distance, max_distance, fov, focus, 0.0f, 1.0f, focus_range, fuzzing_range, ratio); - uniform_value[U_DOF] = 1; + rend_data_ctx.shader_flags.arr[U_DOF] = 1; - gl_rend_state.bind_vertex_array(vao); - render_tiles(depth_texture, true); - downsample(color_texture, depth_texture, true); - apply_main_filter(true); - upsample(rt, buf_rt, color_texture, depth_texture, true); + rend_data_ctx.state.bind_vertex_array(vao); + render_tiles(rend_data_ctx, depth_texture, true); + downsample(rend_data_ctx, color_texture, depth_texture, true); + apply_main_filter(rend_data_ctx, true); + upsample(rend_data_ctx, rt, buf_rt, color_texture, depth_texture, true); - shader::unbind(); + shader::unbind(rend_data_ctx.state); for (int32_t i = 0; i < 8; i++) { - gl_rend_state.bind_sampler(i, 0); - gl_rend_state.active_bind_texture_2d(i, 0); + rend_data_ctx.state.bind_sampler(i, 0); + rend_data_ctx.state.active_bind_texture_2d(i, 0); } - gl_rend_state.bind_vertex_array(0); - gl_rend_state.end_event(); + rend_data_ctx.state.bind_vertex_array(0); + rend_data_ctx.state.end_event(); } - void DOF3::apply_physical(RenderTexture* rt, RenderTexture* buf_rt, GLuint color_texture, + void DOF3::apply_physical(render_data_context& rend_data_ctx, + RenderTexture* rt, RenderTexture* buf_rt, GLuint color_texture, GLuint depth_texture, float_t min_distance, float_t max_distance, float_t focus, float_t focal_length, float_t fov, float_t f_number) { - gl_rend_state.begin_event("renderer::DOF3::apply_physical"); - gl_rend_state.disable_blend(); - gl_rend_state.set_depth_mask(GL_FALSE); - gl_rend_state.set_depth_func(GL_ALWAYS); - update_data(min_distance, max_distance, + rend_data_ctx.state.begin_event("renderer::DOF3::apply_physical"); + rend_data_ctx.state.disable_blend(); + rend_data_ctx.state.set_depth_mask(GL_FALSE); + rend_data_ctx.state.set_depth_func(GL_ALWAYS); + update_data(rend_data_ctx, min_distance, max_distance, fov, focus, focal_length, f_number, 0.0f, 0.1f, 0.0f); - uniform_value[U_DOF] = 0; + rend_data_ctx.shader_flags.arr[U_DOF] = 0; - gl_rend_state.bind_vertex_array(vao); - render_tiles(depth_texture, false); - downsample(color_texture, depth_texture, false); - apply_main_filter(false); - upsample(rt, buf_rt, color_texture, depth_texture, false); + rend_data_ctx.state.bind_vertex_array(vao); + render_tiles(rend_data_ctx, depth_texture, false); + downsample(rend_data_ctx, color_texture, depth_texture, false); + apply_main_filter(rend_data_ctx, false); + upsample(rend_data_ctx, rt, buf_rt, color_texture, depth_texture, false); - shader::unbind(); + shader::unbind(rend_data_ctx.state); for (int32_t i = 0; i < 8; i++) { - gl_rend_state.bind_sampler(i, 0); - gl_rend_state.active_bind_texture_2d(i, 0); + rend_data_ctx.state.bind_sampler(i, 0); + rend_data_ctx.state.active_bind_texture_2d(i, 0); } - gl_rend_state.bind_vertex_array(0); - gl_rend_state.end_event(); + rend_data_ctx.state.bind_vertex_array(0); + rend_data_ctx.state.end_event(); } - void DOF3::render_tiles(GLuint depth_texture, bool f2) { - gl_rend_state.begin_event("renderer::DOF3::render_tiles"); - fbo[0].bind_buffer(); - gl_rend_state.set_viewport(0, 0, fbo[0].width, fbo[0].height); - uniform_value[U_DOF_STAGE] = 0; - shaders_ft.set(SHADER_FT_DOF); - common_ubo.Bind(0); - gl_rend_state.active_bind_texture_2d(0, depth_texture); - gl_rend_state.bind_sampler(0, samplers[1]); - shaders_ft.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); + void DOF3::render_tiles(render_data_context& rend_data_ctx, + GLuint depth_texture, bool f2) { + rend_data_ctx.state.begin_event("renderer::DOF3::render_tiles"); + rend_data_ctx.state.bind_framebuffer(fbo[0].buffer); + rend_data_ctx.state.set_viewport(0, 0, fbo[0].width, fbo[0].height); + rend_data_ctx.shader_flags.arr[U_DOF_STAGE] = 0; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_DOF); + rend_data_ctx.state.bind_uniform_buffer_base(0, common_ubo); + rend_data_ctx.state.active_bind_texture_2d(0, depth_texture); + rend_data_ctx.state.bind_sampler(0, samplers[1]); + rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); - fbo[1].bind_buffer(); - gl_rend_state.set_viewport(0, 0, fbo[1].width, fbo[1].height); - uniform_value[U_DOF_STAGE] = 1; - shaders_ft.set(SHADER_FT_DOF); - gl_rend_state.active_bind_texture_2d(0, textures[0]); - gl_rend_state.bind_sampler(0, samplers[1]); - shaders_ft.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); - gl_rend_state.end_event(); + rend_data_ctx.state.bind_framebuffer(fbo[1].buffer); + rend_data_ctx.state.set_viewport(0, 0, fbo[1].width, fbo[1].height); + rend_data_ctx.shader_flags.arr[U_DOF_STAGE] = 1; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_DOF); + rend_data_ctx.state.active_bind_texture_2d(0, textures[0]); + rend_data_ctx.state.bind_sampler(0, samplers[1]); + rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); + rend_data_ctx.state.end_event(); } - void DOF3::downsample(GLuint color_texture, GLuint depth_texture, bool f2) { - gl_rend_state.begin_event("renderer::DOF3::downsample"); - fbo[2].bind_buffer(); - gl_rend_state.set_viewport(0, 0, fbo[2].width, fbo[2].height); - uniform_value[U_DOF_STAGE] = 2; - shaders_ft.set(SHADER_FT_DOF); - common_ubo.Bind(0); - gl_rend_state.active_bind_texture_2d(0, depth_texture); - gl_rend_state.bind_sampler(0, samplers[1]); - gl_rend_state.active_bind_texture_2d(1, color_texture); - gl_rend_state.bind_sampler(1, samplers[0]); - gl_rend_state.active_bind_texture_2d(2, textures[1]); - gl_rend_state.bind_sampler(2, samplers[1]); - shaders_ft.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); - gl_rend_state.end_event(); + void DOF3::downsample(render_data_context& rend_data_ctx, GLuint color_texture, GLuint depth_texture, bool f2) { + rend_data_ctx.state.begin_event("renderer::DOF3::downsample"); + rend_data_ctx.state.bind_framebuffer(fbo[2].buffer); + rend_data_ctx.state.set_viewport(0, 0, fbo[2].width, fbo[2].height); + rend_data_ctx.shader_flags.arr[U_DOF_STAGE] = 2; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_DOF); + rend_data_ctx.state.bind_uniform_buffer_base(0, common_ubo); + rend_data_ctx.state.active_bind_texture_2d(0, depth_texture); + rend_data_ctx.state.bind_sampler(0, samplers[1]); + rend_data_ctx.state.active_bind_texture_2d(1, color_texture); + rend_data_ctx.state.bind_sampler(1, samplers[0]); + rend_data_ctx.state.active_bind_texture_2d(2, textures[1]); + rend_data_ctx.state.bind_sampler(2, samplers[1]); + rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); + rend_data_ctx.state.end_event(); } - void DOF3::apply_main_filter(bool f2) { - gl_rend_state.begin_event("renderer::DOF3::apply_main_filter"); - fbo[3].bind_buffer(); - gl_rend_state.set_viewport(0, 0, fbo[3].width, fbo[3].height); - uniform_value[U_DOF_STAGE] = 3; - shaders_ft.set(SHADER_FT_DOF); - common_ubo.Bind(0); - texcoords_ubo.Bind(1); - gl_rend_state.active_bind_texture_2d(0, textures[3]); - gl_rend_state.bind_sampler(0, samplers[1]); - gl_rend_state.active_bind_texture_2d(1, textures[2]); - gl_rend_state.bind_sampler(1, samplers[1]); - gl_rend_state.active_bind_texture_2d(2, textures[1]); - gl_rend_state.bind_sampler(2, samplers[1]); - shaders_ft.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); - gl_rend_state.end_event(); + void DOF3::apply_main_filter(render_data_context& rend_data_ctx, bool f2) { + rend_data_ctx.state.begin_event("renderer::DOF3::apply_main_filter"); + rend_data_ctx.state.bind_framebuffer(fbo[3].buffer); + rend_data_ctx.state.set_viewport(0, 0, fbo[3].width, fbo[3].height); + rend_data_ctx.shader_flags.arr[U_DOF_STAGE] = 3; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_DOF); + rend_data_ctx.state.bind_uniform_buffer_base(0, common_ubo); + rend_data_ctx.state.bind_uniform_buffer_base(1, texcoords_ubo); + rend_data_ctx.state.active_bind_texture_2d(0, textures[3]); + rend_data_ctx.state.bind_sampler(0, samplers[1]); + rend_data_ctx.state.active_bind_texture_2d(1, textures[2]); + rend_data_ctx.state.bind_sampler(1, samplers[1]); + rend_data_ctx.state.active_bind_texture_2d(2, textures[1]); + rend_data_ctx.state.bind_sampler(2, samplers[1]); + rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); + rend_data_ctx.state.end_event(); } - void DOF3::upsample(RenderTexture* rt, RenderTexture* buf_rt, + void DOF3::upsample(render_data_context& rend_data_ctx, + RenderTexture* rt, RenderTexture* buf_rt, GLuint color_texture, GLuint depth_texture, bool f2) { - gl_rend_state.begin_event("renderer::DOF3::upsample"); - buf_rt->Bind(); - gl_rend_state.set_viewport(0, 0, width, height); - uniform_value[U_DOF_STAGE] = 4; - shaders_ft.set(SHADER_FT_DOF); - common_ubo.Bind(0); - gl_rend_state.active_bind_texture_2d(0, textures[4]); - gl_rend_state.bind_sampler(0, samplers[1]); - gl_rend_state.active_bind_texture_2d(1, textures[5]); - gl_rend_state.bind_sampler(1, samplers[1]); - gl_rend_state.active_bind_texture_2d(2, textures[1]); - gl_rend_state.bind_sampler(2, samplers[1]); - gl_rend_state.active_bind_texture_2d(3, color_texture); - gl_rend_state.bind_sampler(3, samplers[1]); - gl_rend_state.active_bind_texture_2d(4, depth_texture); - gl_rend_state.bind_sampler(4, samplers[1]); - shaders_ft.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); + rend_data_ctx.state.begin_event("renderer::DOF3::upsample"); + buf_rt->Bind(rend_data_ctx.state); + rend_data_ctx.state.set_viewport(0, 0, width, height); + rend_data_ctx.shader_flags.arr[U_DOF_STAGE] = 4; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_DOF); + rend_data_ctx.state.bind_uniform_buffer_base(0, common_ubo); + rend_data_ctx.state.active_bind_texture_2d(0, textures[4]); + rend_data_ctx.state.bind_sampler(0, samplers[1]); + rend_data_ctx.state.active_bind_texture_2d(1, textures[5]); + rend_data_ctx.state.bind_sampler(1, samplers[1]); + rend_data_ctx.state.active_bind_texture_2d(2, textures[1]); + rend_data_ctx.state.bind_sampler(2, samplers[1]); + rend_data_ctx.state.active_bind_texture_2d(3, color_texture); + rend_data_ctx.state.bind_sampler(3, samplers[1]); + rend_data_ctx.state.active_bind_texture_2d(4, depth_texture); + rend_data_ctx.state.bind_sampler(4, samplers[1]); + rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); glCopyImageSubData( buf_rt->GetColorTex(), GL_TEXTURE_2D, 0, 0, 0, 0, rt->GetColorTex(), GL_TEXTURE_2D, 0, 0, 0, 0, width, height, 1); - gl_rend_state.end_event(); + rend_data_ctx.state.end_event(); } void DOF3::init_textures(int32_t width, int32_t height) { @@ -316,30 +321,31 @@ namespace renderer { int32_t h2 = max_def(height / 2, 1); glGenTextures(6, textures); - glBindTexture(GL_TEXTURE_2D, textures[0]); + gl_state.bind_texture_2d(textures[0]); glTexImage2D(GL_TEXTURE_2D, 0, GL_RG16F, w20, h20, 0, GL_RG, GL_HALF_FLOAT, 0); fbo[0].init(w20, h20, &textures[0], 1, 0); - glBindTexture(GL_TEXTURE_2D, textures[1]); + gl_state.bind_texture_2d(textures[1]); glTexImage2D(GL_TEXTURE_2D, 0, GL_RG16F, w20, h20, 0, GL_RG, GL_HALF_FLOAT, 0); fbo[1].init(w20, h20, &textures[1], 1, 0); - glBindTexture(GL_TEXTURE_2D, textures[2]); + gl_state.bind_texture_2d(textures[2]); glTexImage2D(GL_TEXTURE_2D, 0, GL_R11F_G11F_B10F, w2, h2, 0, GL_RGB, GL_UNSIGNED_INT_10F_11F_11F_REV, 0); - glBindTexture(GL_TEXTURE_2D, textures[3]); + gl_state.bind_texture_2d(textures[3]); glTexImage2D(GL_TEXTURE_2D, 0, GL_R11F_G11F_B10F, w2, h2, 0, GL_RGB, GL_UNSIGNED_INT_10F_11F_11F_REV, 0); fbo[2].init(w2, h2, &textures[2], 2, 0); - glBindTexture(GL_TEXTURE_2D, textures[4]); + gl_state.bind_texture_2d(textures[4]); glTexImage2D(GL_TEXTURE_2D, 0, GL_R11F_G11F_B10F, w2, h2, 0, GL_RGB, GL_UNSIGNED_INT_10F_11F_11F_REV, 0); - glBindTexture(GL_TEXTURE_2D, textures[5]); + gl_state.bind_texture_2d(textures[5]); glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, w2, h2, 0, GL_RED, GL_UNSIGNED_BYTE, 0); fbo[3].init(w2, h2, &textures[4], 2, 0); - glBindTexture(GL_TEXTURE_2D, 0); + gl_state.bind_texture_2d(0); } - void DOF3::update_data(float_t min_dist, float_t max_dist, float_t fov, float_t dist, float_t focal_length, + void DOF3::update_data(render_data_context& rend_data_ctx, + float_t min_dist, float_t max_dist, float_t fov, float_t dist, float_t focal_length, float_t f_number, float_t focus_range, float_t fuzzing_range, float_t ratio) { float_t fl = focal_length; if (dist <= focal_length) @@ -359,7 +365,7 @@ namespace renderer { shader_data.g_depth_params2.y = focus_range; shader_data.g_depth_params2.z = -4.5f / (fuzzing_range * fuzzing_range); shader_data.g_depth_params2.w = ratio * 8.0f; - common_ubo.WriteMemory(shader_data); + common_ubo.WriteMemory(rend_data_ctx.state, shader_data); } void DOF3::calculate_texcoords(vec2* data, float_t size) { diff --git a/src/CRE/renderer/dof.hpp b/src/CRE/renderer/dof.hpp index eea81ad1..d65d97df 100644 --- a/src/CRE/renderer/dof.hpp +++ b/src/CRE/renderer/dof.hpp @@ -38,6 +38,8 @@ struct dof_pv { dof_f2 f2; }; +struct render_data_context; + namespace renderer { struct DOF3 { private: @@ -54,28 +56,32 @@ namespace renderer { DOF3(int32_t width, int32_t height); ~DOF3(); - void apply(RenderTexture* rt, RenderTexture* buf_rt); + void apply(render_data_context& rend_data_ctx, RenderTexture* rt, RenderTexture* buf_rt); void resize(int32_t width, int32_t height); private: void free(); void init(int32_t width, int32_t height); - void apply_f2(RenderTexture* rt, RenderTexture* buf_rt, GLuint color_texture, + void apply_f2(render_data_context& rend_data_ctx, + RenderTexture* rt, RenderTexture* buf_rt, GLuint color_texture, GLuint depth_texture, float_t min_distance, float_t max_distance, float_t fov, float_t focus, float_t focus_range, float_t fuzzing_range, float_t ratio); - void apply_physical(RenderTexture* rt, RenderTexture* buf_rt, GLuint color_texture, + void apply_physical(render_data_context& rend_data_ctx, + RenderTexture* rt, RenderTexture* buf_rt, GLuint color_texture, GLuint depth_texture, float_t min_distance, float_t max_distance, float_t focus, float_t focal_length, float_t fov, float_t f_number); - void render_tiles(GLuint depth_texture, bool f2); - void downsample(GLuint color_texture, GLuint depth_texture, bool f2); - void apply_main_filter(bool f2); - void upsample(RenderTexture* rt, RenderTexture* buf_rt, + void render_tiles(render_data_context& rend_data_ctx, GLuint depth_texture, bool f2); + void downsample(render_data_context& rend_data_ctx, GLuint color_texture, GLuint depth_texture, bool f2); + void apply_main_filter(render_data_context& rend_data_ctx, bool f2); + void upsample(render_data_context& rend_data_ctx, + RenderTexture* rt, RenderTexture* buf_rt, GLuint color_texture, GLuint depth_texture, bool f2); void init_textures(int32_t width, int32_t height); - void update_data(float_t min_dist, float_t max_dist, float_t fov, float_t dist, float_t focal_length, + void update_data(render_data_context& rend_data_ctx, + float_t min_dist, float_t max_dist, float_t fov, float_t dist, float_t focal_length, float_t f_number, float_t focus_range, float_t fuzzing_range, float_t ratio); static void calculate_texcoords(vec2* data, float_t size); diff --git a/src/CRE/renderer/fbo.cpp b/src/CRE/renderer/fbo.cpp index a8f1b455..3753fae0 100644 --- a/src/CRE/renderer/fbo.cpp +++ b/src/CRE/renderer/fbo.cpp @@ -4,7 +4,7 @@ */ #include "fbo.hpp" -#include "../gl_rend_state.hpp" +#include "../gl_state.hpp" namespace renderer { FBO::FBO() : flags(), width(), height(), buffer(), count(), textures() { @@ -41,7 +41,7 @@ namespace renderer { textures[count] = depth_texture; glGenFramebuffers(1, &buffer); - gl_rend_state.bind_framebuffer(buffer, true); + gl_state.bind_framebuffer(buffer, true); for (int32_t i = 0; i < count; i++) glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, textures[i], 0); @@ -53,7 +53,7 @@ namespace renderer { color_attachments[i] = GL_COLOR_ATTACHMENT0 + i; glDrawBuffers(count, color_attachments); glCheckFramebufferStatus(GL_FRAMEBUFFER); - gl_rend_state.bind_framebuffer(0); + gl_state.bind_framebuffer(0); } #pragma warning(pop) diff --git a/src/CRE/renderer/fbo.hpp b/src/CRE/renderer/fbo.hpp index d71a9afa..649abe9f 100644 --- a/src/CRE/renderer/fbo.hpp +++ b/src/CRE/renderer/fbo.hpp @@ -27,9 +27,5 @@ namespace renderer { void init(int32_t width, int32_t height, GLuint* color_textures, int32_t count, GLuint depth_texture); void free(); - - inline void bind_buffer() { - gl_rend_state.bind_framebuffer(buffer); - } }; } diff --git a/src/CRE/renderer/transparency.cpp b/src/CRE/renderer/transparency.cpp index 05b485d3..ffbedd8d 100644 --- a/src/CRE/renderer/transparency.cpp +++ b/src/CRE/renderer/transparency.cpp @@ -39,31 +39,31 @@ namespace renderer { } } - void Transparency::combine(RenderTexture* rt, float_t alpha) { + void Transparency::combine(render_data_context& rend_data_ctx, RenderTexture* rt, float_t alpha) { transparency_batch_shader_data shader_data = {}; shader_data.g_opacity = { alpha, 0.0f, 0.0f, 0.0f }; - rctx_ptr->transparency_batch_ubo.WriteMemory(shader_data); + rctx_ptr->transparency_batch_ubo.WriteMemory(rend_data_ctx.state, shader_data); - gl_rend_state.disable_blend(); - gl_rend_state.disable_depth_test(); - rctx_ptr->render_buffer.Bind(); - shaders_ft.set(SHADER_FT_TRANSPARENCY); - rctx_ptr->transparency_batch_ubo.Bind(0); - gl_rend_state.active_bind_texture_2d(0, fbo.textures[0]); - gl_rend_state.active_bind_texture_2d(1, rt->GetColorTex()); - gl_rend_state.bind_vertex_array(vao); - shaders_ft.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); - gl_rend_state.enable_depth_test(); + rend_data_ctx.state.disable_blend(); + rend_data_ctx.state.disable_depth_test(); + rctx_ptr->render_buffer.Bind(rend_data_ctx.state); + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_TRANSPARENCY); + rend_data_ctx.state.bind_uniform_buffer_base(0, rctx_ptr->transparency_batch_ubo); + rend_data_ctx.state.active_bind_texture_2d(0, fbo.textures[0]); + rend_data_ctx.state.active_bind_texture_2d(1, rt->GetColorTex()); + rend_data_ctx.state.bind_vertex_array(vao); + rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); + rend_data_ctx.state.enable_depth_test(); glCopyImageSubData(rctx_ptr->render_buffer.GetColorTex(), GL_TEXTURE_2D, 0, 0, 0, 0, rt->GetColorTex(), GL_TEXTURE_2D, 0, 0, 0, 0, fbo.width, fbo.height, 1); } - void Transparency::copy(GLuint texture) { + void Transparency::copy(render_data_context& rend_data_ctx, GLuint texture) { glCopyImageSubData(texture, GL_TEXTURE_2D, 0, 0, 0, 0, fbo.textures[0], GL_TEXTURE_2D, 0, 0, 0, 0, fbo.width, fbo.height, 1); - fbo.bind_buffer(); - gl_rend_state.set_viewport(0, 0, fbo.width, fbo.height); + rend_data_ctx.state.bind_framebuffer(fbo.buffer); + rend_data_ctx.state.set_viewport(0, 0, fbo.width, fbo.height); } void Transparency::resize(GLuint color_texture, GLuint depth_texture, int32_t width, int32_t height) { diff --git a/src/CRE/renderer/transparency.hpp b/src/CRE/renderer/transparency.hpp index 7258d35d..9161e9f8 100644 --- a/src/CRE/renderer/transparency.hpp +++ b/src/CRE/renderer/transparency.hpp @@ -10,6 +10,8 @@ #include "../render_texture.hpp" #include "fbo.hpp" +struct render_data_context; + namespace renderer { struct Transparency { private: @@ -21,8 +23,8 @@ namespace renderer { Transparency(GLuint color_texture, GLuint depth_texture, int32_t width, int32_t height); ~Transparency(); - void combine(RenderTexture* rt, float_t alpha); - void copy(GLuint texture); + void combine(render_data_context& rend_data_ctx, RenderTexture* rt, float_t alpha); + void copy(render_data_context& rend_data_ctx, GLuint texture); void resize(GLuint color_texture, GLuint depth_texture, int32_t width, int32_t height); }; diff --git a/src/CRE/rob/ex_block.cpp b/src/CRE/rob/ex_block.cpp index 88f24c0f..7beeb896 100644 --- a/src/CRE/rob/ex_block.cpp +++ b/src/CRE/rob/ex_block.cpp @@ -8,6 +8,7 @@ #include "../../KKdLib/str_utils.hpp" #include "../app_system_detail.hpp" #include "../data.hpp" +#include "../gl_state.hpp" #include "skin_param.hpp" struct exp_func_op1 { @@ -1957,7 +1958,7 @@ void RobCloth::UpdateVertexBuffer(obj_mesh* mesh, obj_mesh_vertex_buffer* vertex vertex_buffer->cycle_index(); GL::ArrayBuffer buffer = vertex_buffer->get_buffer(); - size_t data = (size_t)buffer.MapMemory(); + size_t data = (size_t)buffer.MapMemory(gl_state); if (!data) return; @@ -2093,7 +2094,7 @@ void RobCloth::UpdateVertexBuffer(obj_mesh* mesh, obj_mesh_vertex_buffer* vertex break; } - buffer.UnmapMemory(); + buffer.UnmapMemory(gl_state); } ExClothBlock::ExClothBlock() { diff --git a/src/CRE/rob/rob.cpp b/src/CRE/rob/rob.cpp index a31b8e79..9efddd7b 100644 --- a/src/CRE/rob/rob.cpp +++ b/src/CRE/rob/rob.cpp @@ -16,6 +16,7 @@ #include "../module_table.hpp" #include "../data.hpp" #include "../effect.hpp" +#include "../gl_state.hpp" #include "../hand_item.hpp" #include "../mdata_manager.hpp" #include "../pv_db.hpp" @@ -18129,7 +18130,7 @@ void rob_chara_age_age_object::disp(render_context* rctx, size_t chara_index, obj_vert_buf.cycle_index(); GL::ArrayBuffer buffer = obj_vert_buf.get_buffer(); - size_t vtx_data = (size_t)buffer.MapMemory(); + size_t vtx_data = (size_t)buffer.MapMemory(gl_state); if (!vtx_data) return; @@ -18138,7 +18139,7 @@ void rob_chara_age_age_object::disp(render_context* rctx, size_t chara_index, memmove((void*)(vtx_data + vertex_array_size * i), (void*)((size_t)vertex_data + vertex_array_size * v44[i].second), vertex_array_size); - buffer.UnmapMemory(); + buffer.UnmapMemory(gl_state); mesh.num_vertex = disp_count * num_vertex; sub_mesh.num_index = disp_count * num_index; diff --git a/src/CRE/shader.cpp b/src/CRE/shader.cpp index 8f8ca8c3..29f28556 100644 --- a/src/CRE/shader.cpp +++ b/src/CRE/shader.cpp @@ -14,6 +14,7 @@ #include "Vulkan/Manager.hpp" #include "Vulkan/ShaderModule.hpp" #include "gl_rend_state.hpp" +#include "render_context.hpp" #include "shared.hpp" #include @@ -38,11 +39,9 @@ static GLuint shader_compile_binary(const char* vert, const char* frag, const ch #endif static bool shader_load_binary_shader(program_binary* bin, GLuint* program, const char* vp, const char* fp); static prj::shared_ptr shader_load_spv_shader(program_spv* spv, const char* shader); -static bool shader_update_data(shader_set_data* set); - -int32_t shader::bind(shader_set_data* set, uint32_t sub_index) { - set->curr_program = 0; +int32_t shader::bind(p_gl_rend_state& p_gl_rend_st, + const uniform_value& shader_flags, shader_set_data* set, uint32_t sub_index) { if (num_sub < 1) return -1; @@ -60,7 +59,7 @@ int32_t shader::bind(shader_set_data* set, uint32_t sub_index) { const int32_t* fp_unival_max = sub_shader->fp_unival_max; for (int32_t i = 0; i < num_uniform; i++) { - const int32_t unival = uniform_value[use_uniform[i]]; + const int32_t unival = shader_flags.arr[use_uniform[i]]; const int32_t unival_max = max_def(vp_unival_max[i], fp_unival_max[i]); unival_shad += unival_shad_curr * min_def(unival, unival_max); unival_shad_curr *= unival_max + 1; @@ -68,9 +67,7 @@ int32_t shader::bind(shader_set_data* set, uint32_t sub_index) { } GLuint program = sub_shader->programs[unival_shad]; - set->curr_program = program; - - gl_rend_state.use_program(program); + p_gl_rend_st.use_program(program); return 0; } @@ -489,98 +486,15 @@ char* shader::parse_include(char* data, farc* f) { return temp_data; } -void shader::unbind() { - gl_rend_state.use_program(0); +void shader::unbind(p_gl_rend_state& p_gl_rend_st) { + p_gl_rend_st.use_program(0); } -shader_set_data::shader_set_data() : size(), shaders(), curr_program(), primitive_restart(), -primitive_restart_index(), get_index_by_name_func(), get_name_by_index_func() { +shader_set_data::shader_set_data() : size(), shaders(), +get_index_by_name_func(), get_name_by_index_func() { } -void shader_set_data::disable_primitive_restart() { - primitive_restart = false; -} - -void shader_set_data::draw_arrays(GLenum mode, GLint first, GLsizei count) { - if (shader_update_data(this)) - glDrawArrays(mode, first, count); -} - -void shader_set_data::draw_elements(GLenum mode, - GLsizei count, GLenum type, const void* indices) { - switch (mode) { - case GL_TRIANGLE_STRIP: - uint32_t index; - switch (type) { - case GL_UNSIGNED_BYTE: - index = 0xFF; - break; - case GL_UNSIGNED_SHORT: - index = 0xFFFF; - break; - case GL_UNSIGNED_INT: - default: - index = 0xFFFFFFFF; - break; - } - - enable_primitive_restart(); - - if (primitive_restart_index != index) - primitive_restart_index = index; - break; - } - - if (shader_update_data(this)) - glDrawElements(mode, count, type, indices); - - switch (mode) { - case GL_TRIANGLE_STRIP: - disable_primitive_restart(); - break; - } -} - -void shader_set_data::draw_range_elements(GLenum mode, - GLuint start, GLuint end, GLsizei count, GLenum type, const void* indices) { - switch (mode) { - case GL_TRIANGLE_STRIP: - uint32_t index; - switch (type) { - case GL_UNSIGNED_BYTE: - index = 0xFF; - break; - case GL_UNSIGNED_SHORT: - index = 0xFFFF; - break; - case GL_UNSIGNED_INT: - default: - index = 0xFFFFFFFF; - break; - } - - enable_primitive_restart(); - - if (primitive_restart_index != index) - primitive_restart_index = index; - break; - } - - if (shader_update_data(this)) - glDrawRangeElements(mode, start, end, count, type, indices); - - switch (mode) { - case GL_TRIANGLE_STRIP: - disable_primitive_restart(); - break; - } -} - -void shader_set_data::enable_primitive_restart() { - primitive_restart = true; -} - int32_t shader_set_data::get_index_by_name(const char* name) { if (get_index_by_name_func) { int32_t index = get_index_by_name_func(name); @@ -1120,13 +1034,13 @@ void shader_set_data::load(farc* f, bool ignore_cache, if (programs[k] && samplers.size()) { GLuint program = programs[k]; - gl_rend_state.use_program(program); + glUseProgram(program); for (auto& i : samplers) { GLint loc = glGetUniformLocation(program, i.second.c_str()); if (loc != -1) glUniform1i(loc, i.first); } - gl_rend_state.use_program(0); + glUseProgram(0); } if (programs[k] && uniforms.size()) { @@ -1185,13 +1099,13 @@ void shader_set_data::load(farc* f, bool ignore_cache, if (programs[0] && samplers.size()) { GLuint program = programs[0]; - gl_rend_state.use_program(program); + glUseProgram(program); for (auto& i : samplers) { GLint loc = glGetUniformLocation(program, i.second.c_str()); if (loc != -1) glUniform1i(loc, i.first); } - gl_rend_state.use_program(0); + glUseProgram(0); } if (programs[0] && uniforms.size()) { @@ -1271,16 +1185,16 @@ void shader_set_data::load(farc* f, bool ignore_cache, this->get_name_by_index_func = get_name_by_index; } -void shader_set_data::set(uint32_t index) { +void shader_set_data::set(p_gl_rend_state& p_gl_rend_st, uniform_value& shader_flags, uint32_t index) { if (this && index && index != -1) { shader* shader = &shaders[index]; if (shader->bind_func) - shader->bind_func(this, shader); + shader->bind_func(p_gl_rend_st, shader_flags, this, shader); else - shader->bind(this, shader->sub[0].sub_index); + shader->bind(p_gl_rend_st, shader_flags, this, shader->sub[0].sub_index); } else - shader::unbind(); + shader::unbind(p_gl_rend_st); } void shader_set_data::unload() { @@ -1574,17 +1488,3 @@ static prj::shared_ptr shader_load_spv_shader(program_spv* return prj::shared_ptr(new Vulkan::ShaderModule( Vulkan::current_device, (const void*)((size_t)spv + spv->spv), spv->size)); } - -static bool shader_update_data(shader_set_data* set) { - if (!set || !set->curr_program) - return false; - - if (set->primitive_restart) { - gl_rend_state.enable_primitive_restart(); - gl_rend_state.set_primitive_restart_index(set->primitive_restart_index); - } - else - gl_rend_state.disable_primitive_restart(); - - return true; -} diff --git a/src/CRE/shader.hpp b/src/CRE/shader.hpp index 55a84b3a..f3e47222 100644 --- a/src/CRE/shader.hpp +++ b/src/CRE/shader.hpp @@ -56,7 +56,8 @@ struct shader_set_data; typedef int32_t (*PFNSHADERGETINDEXFUNCPROC)(const char* name); typedef const char* (*PFNSHADERGETNAMEFUNCPROC)(int32_t index); -typedef void (*PFNSHADERBINDFUNCPROC)(shader_set_data* set, shader* shad); +typedef void (*PFNSHADERBINDFUNCPROC)(struct p_gl_rend_state& p_gl_rend_st, + struct uniform_value& shader_flags, shader_set_data* set, shader* shad); struct shader_bind_func { uint32_t name_index; @@ -81,40 +82,31 @@ struct shader { const uniform_name* use_uniform; PFNSHADERBINDFUNCPROC bind_func; - int32_t bind(shader_set_data* set, uint32_t sub_index); + int32_t bind(struct p_gl_rend_state& p_gl_rend_st, + const struct uniform_value& shader_flags, shader_set_data* set, uint32_t sub_index); static bool parse_define(const char* data, std::string& temp, bool vulkan = false); static bool parse_define(const char* data, int32_t num_uniform, int32_t* uniform_value, std::string& temp, bool vulkan = false); static char* parse_include(char* data, farc* f); - static void unbind(); + static void unbind(struct p_gl_rend_state& p_gl_rend_st); }; struct shader_set_data { size_t size; shader* shaders; - GLuint curr_program; - GLboolean primitive_restart; - GLuint primitive_restart_index; PFNSHADERGETINDEXFUNCPROC get_index_by_name_func; PFNSHADERGETNAMEFUNCPROC get_name_by_index_func; shader_set_data(); - void disable_primitive_restart(); - void draw_arrays(GLenum mode, GLint first, GLsizei count); - void draw_elements(GLenum mode, - GLsizei count, GLenum type, const void* indices); - void draw_range_elements(GLenum mode, - GLuint start, GLuint end, GLsizei count, GLenum type, const void* indices); - void enable_primitive_restart(); int32_t get_index_by_name(const char* name); const char* get_name_by_index(int32_t index); void load(farc* f, bool ignore_cache, const char* name, const shader_table* shaders_table, const size_t size, const shader_bind_func* bind_func_table, const size_t bind_func_table_size, PFNSHADERGETINDEXFUNCPROC get_index_by_name, PFNSHADERGETNAMEFUNCPROC get_name_by_index); - void set(uint32_t index); + void set(struct p_gl_rend_state& p_gl_rend_st, struct uniform_value& shader_flags, uint32_t index); void unload(); }; diff --git a/src/CRE/shader_ft.cpp b/src/CRE/shader_ft.cpp index 96c7d090..a1106121 100644 --- a/src/CRE/shader_ft.cpp +++ b/src/CRE/shader_ft.cpp @@ -2573,23 +2573,39 @@ const size_t shader_ft_table_size = sizeof(shader_ft_table) / sizeof(shader_table); static void glass_eye_calc(glass_eye_struct* glass_eye); -static void glass_eye_set(glass_eye_struct* glass_eye); -static void shader_bind_blinn(shader_set_data* set, shader* shad); -static void shader_bind_cloth(shader_set_data* set, shader* shad); -static void shader_bind_hair(shader_set_data* set, shader* shad); -static void shader_bind_glass_eye(shader_set_data* set, shader* shad); -static void shader_bind_tone_map(shader_set_data* set, shader* shad); -static void shader_bind_sss_filter(shader_set_data* set, shader* shad); -static void shader_bind_esm_filter(shader_set_data* set, shader* shad); -static void shader_bind_reduce_tex(shader_set_data* set, shader* shad); -static void shader_bind_magnify(shader_set_data* set, shader* shad); -static void shader_bind_mlaa(shader_set_data* set, shader* shad); -static void shader_bind_exposure(shader_set_data* set, shader* shad); -static void shader_bind_gauss(shader_set_data* set, shader* shad); -static void shader_bind_snow_particle(shader_set_data* set, shader* shad); -static void shader_bind_star(shader_set_data* set, shader* shad); -static void shader_bind_imgfilter(shader_set_data* set, shader* shad); -static void shader_bind_dof(shader_set_data* set, shader* shad); +static void glass_eye_set(p_gl_rend_state& p_gl_rend_st, glass_eye_struct* glass_eye); +static void shader_bind_blinn(p_gl_rend_state& p_gl_rend_st, + uniform_value& shader_flags, shader_set_data* set, shader* shad); +static void shader_bind_cloth(p_gl_rend_state& p_gl_rend_st, + uniform_value& shader_flags, shader_set_data* set, shader* shad); +static void shader_bind_hair(p_gl_rend_state& p_gl_rend_st, + uniform_value& shader_flags, shader_set_data* set, shader* shad); +static void shader_bind_glass_eye(p_gl_rend_state& p_gl_rend_st, + uniform_value& shader_flags, shader_set_data* set, shader* shad); +static void shader_bind_tone_map(p_gl_rend_state& p_gl_rend_st, + uniform_value& shader_flags, shader_set_data* set, shader* shad); +static void shader_bind_sss_filter(p_gl_rend_state& p_gl_rend_st, + uniform_value& shader_flags, shader_set_data* set, shader* shad); +static void shader_bind_esm_filter(p_gl_rend_state& p_gl_rend_st, + uniform_value& shader_flags, shader_set_data* set, shader* shad); +static void shader_bind_reduce_tex(p_gl_rend_state& p_gl_rend_st, + uniform_value& shader_flags, shader_set_data* set, shader* shad); +static void shader_bind_magnify(p_gl_rend_state& p_gl_rend_st, + uniform_value& shader_flags, shader_set_data* set, shader* shad); +static void shader_bind_mlaa(p_gl_rend_state& p_gl_rend_st, + uniform_value& shader_flags, shader_set_data* set, shader* shad); +static void shader_bind_exposure(p_gl_rend_state& p_gl_rend_st, + uniform_value& shader_flags, shader_set_data* set, shader* shad); +static void shader_bind_gauss(p_gl_rend_state& p_gl_rend_st, + uniform_value& shader_flags, shader_set_data* set, shader* shad); +static void shader_bind_snow_particle(p_gl_rend_state& p_gl_rend_st, + uniform_value& shader_flags, shader_set_data* set, shader* shad); +static void shader_bind_star(p_gl_rend_state& p_gl_rend_st, + uniform_value& shader_flags, shader_set_data* set, shader* shad); +static void shader_bind_imgfilter(p_gl_rend_state& p_gl_rend_st, + uniform_value& shader_flags, shader_set_data* set, shader* shad); +static void shader_bind_dof(p_gl_rend_state& p_gl_rend_st, + uniform_value& shader_flags, shader_set_data* set, shader* shad); const shader_bind_func shader_ft_bind_func_table[] = { { @@ -2729,7 +2745,7 @@ static void glass_eye_calc(glass_eye_struct* glass_eye) { glass_eye->tex_offset.w = 0.0f; } -static void glass_eye_set(glass_eye_struct* glass_eye) { +static void glass_eye_set(p_gl_rend_state& p_gl_rend_st, glass_eye_struct* glass_eye) { glass_eye_batch_shader_data glass_eye_batch = {}; vec3 ellipsoid_radius = glass_eye->cornea_radius * glass_eye->cornea_radius; @@ -2776,228 +2792,244 @@ static void glass_eye_set(glass_eye_struct* glass_eye) { glass_eye_batch.g_tex_scale.w = glass_eye->lens_depth; extern render_context* rctx_ptr; - rctx_ptr->glass_eye_batch_ubo.WriteMemory(glass_eye_batch); - rctx_ptr->glass_eye_batch_ubo.Bind(3); + rctx_ptr->glass_eye_batch_ubo.WriteMemory(p_gl_rend_st, glass_eye_batch); + p_gl_rend_st.bind_uniform_buffer_base(3, rctx_ptr->glass_eye_batch_ubo); } -static void shader_bind_blinn(shader_set_data* set, shader* shad) { - shad->bind(set, uniform_value[U_NORMAL] +static void shader_bind_blinn(p_gl_rend_state& p_gl_rend_st, + uniform_value& shader_flags, shader_set_data* set, shader* shad) { + shad->bind(p_gl_rend_st, shader_flags, set, shader_flags.arr[U_NORMAL] ? SHADER_FT_SUB_BLINN_FRAG : SHADER_FT_SUB_BLINN_VERT); } -static void shader_bind_cloth(shader_set_data* set, shader* shad) { - shad->bind(set, uniform_value[U_NPR] ? SHADER_FT_SUB_CLOTH_NPR1 - : (uniform_value[U_ANISO] ? SHADER_FT_SUB_CLOTH_ANISO : SHADER_FT_SUB_CLOTH_DEFAULT)); +static void shader_bind_cloth(p_gl_rend_state& p_gl_rend_st, + uniform_value& shader_flags, shader_set_data* set, shader* shad) { + shad->bind(p_gl_rend_st, shader_flags, set, shader_flags.arr[U_NPR] ? SHADER_FT_SUB_CLOTH_NPR1 + : (shader_flags.arr[U_ANISO] ? SHADER_FT_SUB_CLOTH_ANISO : SHADER_FT_SUB_CLOTH_DEFAULT)); } -static void shader_bind_hair(shader_set_data* set, shader* shad) { - shad->bind(set, uniform_value[U_NPR] ? SHADER_FT_SUB_HAIR_NPR1 : SHADER_FT_SUB_HAIR_DEFAULT); +static void shader_bind_hair(p_gl_rend_state& p_gl_rend_st, + uniform_value& shader_flags, shader_set_data* set, shader* shad) { + shad->bind(p_gl_rend_st, shader_flags, set, shader_flags.arr[U_NPR] ? SHADER_FT_SUB_HAIR_NPR1 : SHADER_FT_SUB_HAIR_DEFAULT); } -static void shader_bind_glass_eye(shader_set_data* set, shader* shad) { - uniform_value[U_EYE_LENS] = 0; - if (set->shaders[SHADER_FT_GLASEYE].bind(set, SHADER_FT_SUB_GLASS_EYE) >= 0) { +static void shader_bind_glass_eye(p_gl_rend_state& p_gl_rend_st, + uniform_value& shader_flags, shader_set_data* set, shader* shad) { + shader_flags.arr[U_EYE_LENS] = 0; + if (set->shaders[SHADER_FT_GLASEYE].bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_GLASS_EYE) >= 0) { glass_eye_calc(&glass_eye); - glass_eye_set(&glass_eye); + glass_eye_set(p_gl_rend_st, &glass_eye); } } -static void shader_bind_tone_map(shader_set_data* set, shader* shad) { - shad->bind(set, uniform_value[U_NPR] == 1 +static void shader_bind_tone_map(p_gl_rend_state& p_gl_rend_st, + uniform_value& shader_flags, shader_set_data* set, shader* shad) { + shad->bind(p_gl_rend_st, shader_flags, set, shader_flags.arr[U_NPR] == 1 ? SHADER_FT_SUB_TONEMAP_NPR1 : SHADER_FT_SUB_TONEMAP); } -static void shader_bind_sss_filter(shader_set_data* set, shader* shad) { - switch (uniform_value[U_SSS_FILTER]) { +static void shader_bind_sss_filter(p_gl_rend_state& p_gl_rend_st, + uniform_value& shader_flags, shader_set_data* set, shader* shad) { + switch (shader_flags.arr[U_SSS_FILTER]) { case 0: - shad->bind(set, uniform_value[U_NPR] + shad->bind(p_gl_rend_st, shader_flags, set, shader_flags.arr[U_NPR] ? SHADER_FT_SUB_SSS_FILTER_MIN_NPR : SHADER_FT_SUB_SSS_FILTER_MIN); break; case 3: - shad->bind(set, SHADER_FT_SUB_SSS_FILTER_GAUSS_2D); + shad->bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_SSS_FILTER_GAUSS_2D); break; } } -static void shader_bind_esm_filter(shader_set_data* set, shader* shad) { - switch (uniform_value[U_ESM_FILTER]) { +static void shader_bind_esm_filter(p_gl_rend_state& p_gl_rend_st, + uniform_value& shader_flags, shader_set_data* set, shader* shad) { + switch (shader_flags.arr[U_ESM_FILTER]) { case 0: - shad->bind(set, SHADER_FT_SUB_ESM_FILTER_MIN); + shad->bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_ESM_FILTER_MIN); break; case 1: - shad->bind(set, SHADER_FT_SUB_ESM_FILTER_EROSION); + shad->bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_ESM_FILTER_EROSION); break; } } -static void shader_bind_reduce_tex(shader_set_data* set, shader* shad) { - switch (uniform_value[U_REDUCE]) { +static void shader_bind_reduce_tex(p_gl_rend_state& p_gl_rend_st, + uniform_value& shader_flags, shader_set_data* set, shader* shad) { + switch (shader_flags.arr[U_REDUCE]) { case 0: - switch (uniform_value[U_ALPHA_MASK]) { + switch (shader_flags.arr[U_ALPHA_MASK]) { case 0: - shad->bind(set, SHADER_FT_SUB_REDUCE_TEX_REDUCE_2); + shad->bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_REDUCE_TEX_REDUCE_2); break; default: - shad->bind(set, SHADER_FT_SUB_REDUCE_TEX_REDUCE_2_ALPHAMASK); + shad->bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_REDUCE_TEX_REDUCE_2_ALPHAMASK); break; } break; case 1: - switch (uniform_value[U_ALPHA_MASK]) { + switch (shader_flags.arr[U_ALPHA_MASK]) { case 0: - shad->bind(set, SHADER_FT_SUB_REDUCE_TEX_REDUCE_4); + shad->bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_REDUCE_TEX_REDUCE_4); break; } break; case 3: - switch (uniform_value[U_ALPHA_MASK]) { + switch (shader_flags.arr[U_ALPHA_MASK]) { case 0: - shad->bind(set, SHADER_FT_SUB_REDUCE_TEX_REDUCE_4_EXTRACT); + shad->bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_REDUCE_TEX_REDUCE_4_EXTRACT); break; } break; case 4: - switch (uniform_value[U_ALPHA_MASK]) { + switch (shader_flags.arr[U_ALPHA_MASK]) { case 0: - shad->bind(set, SHADER_FT_SUB_GHOST); + shad->bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_GHOST); break; } break; case 5: - switch (uniform_value[U_ALPHA_MASK]) { + switch (shader_flags.arr[U_ALPHA_MASK]) { case 0: - shad->bind(set, SHADER_FT_SUB_REDUCE_TEX_REDUCE_COMPOSITE_2); + shad->bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_REDUCE_TEX_REDUCE_COMPOSITE_2); break; } break; case 6: - switch (uniform_value[U_ALPHA_MASK]) { + switch (shader_flags.arr[U_ALPHA_MASK]) { case 0: - shad->bind(set, SHADER_FT_SUB_REDUCE_TEX_REDUCE_COMPOSITE_BLUR); + shad->bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_REDUCE_TEX_REDUCE_COMPOSITE_BLUR); break; } break; case 7: - switch (uniform_value[U_ALPHA_MASK]) { + switch (shader_flags.arr[U_ALPHA_MASK]) { case 0: - shad->bind(set, SHADER_FT_SUB_REDUCE_TEX_REDUCE_COMPOSITE_4); + shad->bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_REDUCE_TEX_REDUCE_COMPOSITE_4); break; } break; } } -static void shader_bind_magnify(shader_set_data* set, shader* shad) { - switch (uniform_value[U_MAGNIFY]) { +static void shader_bind_magnify(p_gl_rend_state& p_gl_rend_st, + uniform_value& shader_flags, shader_set_data* set, shader* shad) { + switch (shader_flags.arr[U_MAGNIFY]) { case 0: - shad->bind(set, SHADER_FT_SUB_MAGNIFY_LINEAR); + shad->bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_MAGNIFY_LINEAR); break; case 2: - shad->bind(set, SHADER_FT_SUB_MAGNIFY_DIFF); + shad->bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_MAGNIFY_DIFF); break; case 3: - shad->bind(set, SHADER_FT_SUB_MAGNIFY_DIFF2); + shad->bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_MAGNIFY_DIFF2); break; case 4: - shad->bind(set, SHADER_FT_SUB_MAGNIFY_CONE); + shad->bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_MAGNIFY_CONE); break; case 5: - shad->bind(set, SHADER_FT_SUB_MAGNIFY_CONE2); + shad->bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_MAGNIFY_CONE2); break; } } -static void shader_bind_mlaa(shader_set_data* set, shader* shad) { - switch (uniform_value[U_MLAA]) { +static void shader_bind_mlaa(p_gl_rend_state& p_gl_rend_st, + uniform_value& shader_flags, shader_set_data* set, shader* shad) { + switch (shader_flags.arr[U_MLAA]) { case 0: - shad->bind(set, SHADER_FT_SUB_MLAA_EDGE); + shad->bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_MLAA_EDGE); break; case 1: - shad->bind(set, SHADER_FT_SUB_MLAA_AREA); + shad->bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_MLAA_AREA); break; case 2: - shad->bind(set, SHADER_FT_SUB_MLAA_BLEND); + shad->bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_MLAA_BLEND); break; } } -static void shader_bind_exposure(shader_set_data* set, shader* shad) { - switch (uniform_value[U_EXPOSURE]) { +static void shader_bind_exposure(p_gl_rend_state& p_gl_rend_st, + uniform_value& shader_flags, shader_set_data* set, shader* shad) { + switch (shader_flags.arr[U_EXPOSURE]) { case 0: - shad->bind(set, SHADER_FT_SUB_EXPOSURE_MINIFY); + shad->bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_EXPOSURE_MINIFY); break; case 1: - shad->bind(set, SHADER_FT_SUB_EXPOSURE_MEASURE); + shad->bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_EXPOSURE_MEASURE); break; case 2: - shad->bind(set, SHADER_FT_SUB_EXPOSURE_AVERAGE); + shad->bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_EXPOSURE_AVERAGE); break; } } -static void shader_bind_gauss(shader_set_data* set, shader* shad) { - switch (uniform_value[U_GAUSS]) { +static void shader_bind_gauss(p_gl_rend_state& p_gl_rend_st, + uniform_value& shader_flags, shader_set_data* set, shader* shad) { + switch (shader_flags.arr[U_GAUSS]) { case 0: - shad->bind(set, SHADER_FT_SUB_PP_GAUSS_USUAL); + shad->bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_PP_GAUSS_USUAL); break; case 1: - shad->bind(set, SHADER_FT_SUB_PP_GAUSS_CONE); + shad->bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_PP_GAUSS_CONE); break; } } -static void shader_bind_snow_particle(shader_set_data* set, shader* shad) { - switch (uniform_value[U_SNOW_PARTICLE]) { +static void shader_bind_snow_particle(p_gl_rend_state& p_gl_rend_st, + uniform_value& shader_flags, shader_set_data* set, shader* shad) { + switch (shader_flags.arr[U_SNOW_PARTICLE]) { case 0: - shad->bind(set, SHADER_FT_SUB_SNOW_PARTICLE_CPU); + shad->bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_SNOW_PARTICLE_CPU); break; case 1: - shad->bind(set, SHADER_FT_SUB_SNOW_PARTICLE); + shad->bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_SNOW_PARTICLE); break; } } -static void shader_bind_star(shader_set_data* set, shader* shad) { - switch (uniform_value[U_STAR]) { +static void shader_bind_star(p_gl_rend_state& p_gl_rend_st, + uniform_value& shader_flags, shader_set_data* set, shader* shad) { + switch (shader_flags.arr[U_STAR]) { case 0: - shad->bind(set, SHADER_FT_SUB_STAR); + shad->bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_STAR); break; case 1: - shad->bind(set, SHADER_FT_SUB_STAR_MILKY_WAY); + shad->bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_STAR_MILKY_WAY); break; } } -static void shader_bind_imgfilter(shader_set_data* set, shader* shad) { - switch (uniform_value[U_IMAGE_FILTER]) { +static void shader_bind_imgfilter(p_gl_rend_state& p_gl_rend_st, + uniform_value& shader_flags, shader_set_data* set, shader* shad) { + switch (shader_flags.arr[U_IMAGE_FILTER]) { case 0: - shad->bind(set, SHADER_FT_SUB_BOX4); + shad->bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_BOX4); break; case 1: - shad->bind(set, SHADER_FT_SUB_BOX8); + shad->bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_BOX8); break; case 5: - shad->bind(set, SHADER_FT_SUB_COPY); + shad->bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_COPY); break; } } -static void shader_bind_dof(shader_set_data* set, shader* shad) { - switch (uniform_value[U_DOF_STAGE]) { +static void shader_bind_dof(p_gl_rend_state& p_gl_rend_st, + uniform_value& shader_flags, shader_set_data* set, shader* shad) { + switch (shader_flags.arr[U_DOF_STAGE]) { case 0: - shad->bind(set, SHADER_FT_SUB_DOF_RENDER_TILE); + shad->bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_DOF_RENDER_TILE); break; case 1: - shad->bind(set, SHADER_FT_SUB_DOF_GATHER_TILE); + shad->bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_DOF_GATHER_TILE); break; case 2: - shad->bind(set, SHADER_FT_SUB_DOF_DOWNSAMPLE); + shad->bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_DOF_DOWNSAMPLE); break; case 3: - shad->bind(set, SHADER_FT_SUB_DOF_MAIN_FILTER); + shad->bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_DOF_MAIN_FILTER); break; case 4: - shad->bind(set, SHADER_FT_SUB_DOF_UPSAMPLE); + shad->bind(p_gl_rend_st, shader_flags, set, SHADER_FT_SUB_DOF_UPSAMPLE); break; } } diff --git a/src/CRE/shadow.cpp b/src/CRE/shadow.cpp index 8eddbc6b..0e1a5e9e 100644 --- a/src/CRE/shadow.cpp +++ b/src/CRE/shadow.cpp @@ -4,6 +4,7 @@ */ #include "shadow.hpp" +#include "gl_state.hpp" #include "render_context.hpp" Shadow* shadow_ptr; @@ -30,14 +31,38 @@ Shadow::~Shadow() { free(); } -void Shadow::clear_textures() { +void Shadow::calc_proj_view_mat(cam_data& cam, const vec3& view_point, + const vec3& interest, float_t range, float_t offset, float_t scale) { + cam.set_view_point(view_point); + cam.set_interest(interest); + + vec3 up = { 0.0f, 1.0f, 0.0f }; + const vec3 dir = interest - view_point; + if (vec3::length_squared(dir) <= 0.000001f) { + up.x = 0.0f; + up.y = 0.0f; + if (dir.z < 0.0f) + up.z = 1.0f; + else + up.z = -1.0f; + } + cam.set_up(up); + + cam.calc_view_mat(); + cam.set_min_distance(z_near); + cam.set_max_distance(z_far); + cam.calc_ortho_proj_mat(-range, range, -range, range, scale, { offset, 0.0f }); + cam.calc_view_proj_mat(); +} + +void Shadow::clear_textures(p_gl_rend_state& p_gl_rend_st) { for (int32_t i = 1; i < 3; i++) for (int32_t j = 0; j < 4; j++) { - curr_render_textures[i]->Bind(j); + curr_render_textures[i]->Bind(p_gl_rend_st, j); glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); } - gl_rend_state.bind_framebuffer(0); + p_gl_rend_st.bind_framebuffer(0); } void Shadow::ctrl() { @@ -101,7 +126,7 @@ int32_t Shadow::init() { return -1; for (int32_t i = 0; i < 3; i++) { - glBindTexture(GL_TEXTURE_2D, render_textures[i].GetColorTex()); + gl_state.bind_texture_2d(render_textures[i].GetColorTex()); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 16.0f); @@ -109,10 +134,10 @@ int32_t Shadow::init() { glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, (GLfloat*)&border_color); } - glBindTexture(GL_TEXTURE_2D, render_textures[0].GetDepthTex()); + gl_state.bind_texture_2d(render_textures[0].GetDepthTex()); GLint swizzle[] = { GL_RED, GL_RED, GL_RED, GL_ONE }; glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle); - glBindTexture(GL_TEXTURE_2D, 0); + gl_state.bind_texture_2d(0); gl_get_error_print(); return 0; } diff --git a/src/CRE/shadow.hpp b/src/CRE/shadow.hpp index 11d747a6..bd1cf5e5 100644 --- a/src/CRE/shadow.hpp +++ b/src/CRE/shadow.hpp @@ -59,7 +59,9 @@ struct Shadow { Shadow(); virtual ~Shadow(); - void clear_textures(); + void calc_proj_view_mat(struct cam_data& cam, const vec3& view_point, + const vec3& interest, float_t range, float_t offset, float_t scale); + void clear_textures(struct p_gl_rend_state& p_gl_rend_st); void ctrl(); void free(); float_t get_shadow_range(); diff --git a/src/CRE/shared.cpp b/src/CRE/shared.cpp index da051b83..c6af71e9 100644 --- a/src/CRE/shared.cpp +++ b/src/CRE/shared.cpp @@ -6,11 +6,11 @@ #include "shared.hpp" #include "gl_rend_state.hpp" -void fbo_blit(GLuint src_fbo, GLuint dst_fbo, +void fbo_blit(p_gl_rend_state& p_gl_rend_st, GLuint src_fbo, GLuint dst_fbo, GLint src_x, GLint src_y, GLint src_width, GLint src_height, GLint dst_x, GLint dst_y, GLint dst_width, GLint dst_height, GLbitfield mask, GLenum filter) { - gl_rend_state.bind_read_framebuffer(src_fbo); - gl_rend_state.bind_draw_framebuffer(dst_fbo); + p_gl_rend_st.bind_read_framebuffer(src_fbo); + p_gl_rend_st.bind_draw_framebuffer(dst_fbo); glBlitFramebuffer(src_x, src_y, src_x + src_width, src_y + src_height, dst_x, dst_y, dst_x + dst_width, dst_y + dst_height, mask, filter); } diff --git a/src/CRE/shared.hpp b/src/CRE/shared.hpp index 87332249..440d1c42 100644 --- a/src/CRE/shared.hpp +++ b/src/CRE/shared.hpp @@ -18,7 +18,7 @@ enum blur_filter_mode { BLUR_FILTER_MAX = 0x04, }; -extern void fbo_blit(GLuint src_fbo, GLuint dst_fbo, +extern void fbo_blit(struct p_gl_rend_state& p_gl_rend_st, GLuint src_fbo, GLuint dst_fbo, GLint src_x, GLint src_y, GLint src_width, GLint src_height, GLint dst_x, GLint dst_y, GLint dst_width, GLint dst_height, GLbitfield mask, GLenum filter); diff --git a/src/CRE/sprite.cpp b/src/CRE/sprite.cpp index 239be4f3..a538e1c6 100644 --- a/src/CRE/sprite.cpp +++ b/src/CRE/sprite.cpp @@ -12,6 +12,8 @@ #include "data.hpp" #include "file_handler.hpp" #include "gl.hpp" +#include "gl_state.hpp" +#include "render_context.hpp" #include "shader_ft.hpp" #include "texture.hpp" @@ -158,7 +160,8 @@ namespace spr { uint32_t AddSetModern(); void AddSprSets(const sprite_database* spr_db); void Clear(); - void Draw(int32_t index, bool font, texture* overlay_tex, const mat4& vp); + void Draw(render_data_context& rend_data_ctx, + int32_t index, bool font, texture* overlay_tex, const mat4& vp); SprSet* GetSet(uint32_t index); bool GetSetReady(uint32_t index); uint32_t GetSetSpriteNum(uint32_t index); @@ -187,12 +190,14 @@ namespace spr { static void add_draw_sprite(spr::SprArgs** args_array, int32_t count, bool font, spr::SprArgsInner& args_inner, std::vector& draw_param_buffer, std::vector& vertex_buffer, std::vector& index_buffer); - static void draw_sprite(spr::SpriteManager* sprite_manager, render_context* rctx, const SprArgs& args, + static void draw_sprite(render_data_context& rend_data_ctx, + spr::SpriteManager* sprite_manager, const SprArgs& args, const mat4& mat, int32_t x_min, int32_t y_min, int32_t x_max, int32_t y_max, texture* overlay_tex); - static void draw_sprite_begin(render_context* rctx); - static void draw_sprite_copy_overlay_texture(render_context* rctx, const SprArgs& args, const mat4& mat, - const vec3* vtx, int32_t overlay_x_min, int32_t overlay_y_min, int32_t overlay_x_max, int32_t overlay_y_max); - static void draw_sprite_end(); + static void draw_sprite_begin(render_data_context& rend_data_ctx); + static void draw_sprite_copy_overlay_texture( + render_data_context& rend_data_ctx, const SprArgs& args, const mat4& mat, const vec3* vtx, + int32_t overlay_x_min, int32_t overlay_y_min, int32_t overlay_x_max, int32_t overlay_y_max); + static void draw_sprite_end(render_data_context& rend_data_ctx); static void draw_sprite_scale(spr::SprArgs* args); } @@ -476,8 +481,9 @@ void sprite_manager_clear() { sprite_manager->Clear(); } -void sprite_manager_draw(int32_t index, bool font, texture* overlay_tex, const mat4& vp) { - sprite_manager->Draw(index, font, overlay_tex, vp); +void sprite_manager_draw(render_data_context& rend_data_ctx, + int32_t index, bool font, texture* overlay_tex, const mat4& vp) { + sprite_manager->Draw(rend_data_ctx, index, font, overlay_tex, vp); } int32_t sprite_manager_get_index() { @@ -607,14 +613,14 @@ void sprite_manager_free() { namespace spr { SpriteManager::RenderData::RenderData() : vao() { glGenVertexArrays(1, &vao); - glBindVertexArray(vao); + gl_state.bind_vertex_array(vao); vbo_vertex_count = 4096; static const GLsizei buffer_size = sizeof(sprite_draw_vertex); - vbo.Create(buffer_size * vbo_vertex_count); - glBindBuffer(GL_ARRAY_BUFFER, vbo); + vbo.Create(gl_state, buffer_size * vbo_vertex_count); + gl_state.bind_array_buffer(vbo); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, buffer_size, @@ -628,12 +634,12 @@ namespace spr { ebo_index_count = 4096; - ebo.Create(sizeof(uint32_t) * ebo_index_count); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo); + ebo.Create(gl_state, sizeof(uint32_t) * ebo_index_count); + gl_state.bind_element_array_buffer(ebo); - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindVertexArray(0); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + gl_state.bind_array_buffer(0); + gl_state.bind_vertex_array(0); + gl_state.bind_element_array_buffer(0); } SpriteManager::RenderData::~RenderData() { @@ -661,10 +667,10 @@ namespace spr { vbo.Destroy(); - glBindVertexArray(vao); + gl_state.bind_vertex_array(vao); - vbo.Create(buffer_size * vbo_vertex_count); - glBindBuffer(GL_ARRAY_BUFFER, vbo); + vbo.Create(gl_state, buffer_size * vbo_vertex_count); + gl_state.bind_array_buffer(vbo); glBufferSubData(GL_ARRAY_BUFFER, 0, (GLsizeiptr)(buffer_size * vertex_buffer.size()), vertex_buffer.data()); @@ -679,11 +685,11 @@ namespace spr { glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, buffer_size, (void*)offsetof(sprite_draw_vertex, uv)); - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindVertexArray(0); + gl_state.bind_array_buffer(0); + gl_state.bind_vertex_array(0); } else - vbo.WriteMemory(0, buffer_size * vertex_buffer.size(), vertex_buffer.data()); + vbo.WriteMemory(gl_state, 0, buffer_size * vertex_buffer.size(), vertex_buffer.data()); if (ebo_index_count < index_buffer.size()) { while (ebo_index_count < index_buffer.size()) @@ -691,19 +697,19 @@ namespace spr { ebo.Destroy(); - glBindVertexArray(vao); + gl_state.bind_vertex_array(vao); - ebo.Create(sizeof(uint32_t) * ebo_index_count); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo); + ebo.Create(gl_state, sizeof(uint32_t) * ebo_index_count); + gl_state.bind_element_array_buffer(ebo); glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, (GLsizeiptr)(sizeof(uint32_t) * index_buffer.size()), index_buffer.data()); - glBindVertexArray(0); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + gl_state.bind_vertex_array(0); + gl_state.bind_element_array_buffer(0); } else - ebo.WriteMemory(0, sizeof(uint32_t) * index_buffer.size(), index_buffer.data()); + ebo.WriteMemory(gl_state, 0, sizeof(uint32_t) * index_buffer.size(), index_buffer.data()); } SpriteManager::SpriteManager() : aspect(), index(), set_counter() { @@ -777,15 +783,16 @@ namespace spr { render_data.Clear(); } - void SpriteManager::Draw(int32_t index, bool font, texture* overlay_tex, const mat4& vp) { + void SpriteManager::Draw(render_data_context& rend_data_ctx, + int32_t index, bool font, texture* overlay_tex, const mat4& vp) { render_context* rctx = rctx_ptr; - draw_sprite_begin(rctx); + draw_sprite_begin(rend_data_ctx); ::resolution_mode mode = res_window_get()->resolution_mode; if (index == 2 && resolution_mode != RESOLUTION_MODE_MAX) res_window_get()->resolution_mode = resolution_mode; - gl_rend_state_rect viewport_rect = gl_rend_state.get_viewport(); + gl_rend_state_rect viewport_rect = rend_data_ctx.state.get_viewport(); for (int32_t i = 0; i < 2; i++) { auto reqlist = this->reqlist[index][i]; @@ -826,7 +833,7 @@ namespace spr { y_min = (int32_t)min.y; x_max = (int32_t)(max.x - min.x); y_max = (int32_t)(max.y - min.y); - gl_rend_state.set_viewport(x_min, y_min, x_max, y_max); + rend_data_ctx.state.set_viewport(x_min, y_min, x_max, y_max); } else { view_projection = vp; @@ -858,21 +865,21 @@ namespace spr { 1.0f / (float_t)overlay_tex->height, 0.0f, 0.0f }; mat4_transpose(&view_projection, &shader_data.g_transform); - rctx->sprite_scene_ubo.WriteMemory(shader_data); - rctx->sprite_scene_ubo.Bind(0); + rctx->sprite_scene_ubo.WriteMemory(rend_data_ctx.state, shader_data); + rend_data_ctx.state.bind_uniform_buffer_base(0, rctx->sprite_scene_ubo); - gl_rend_state.bind_vertex_array(render_data.vao); + rend_data_ctx.state.bind_vertex_array(render_data.vao); for (uint32_t j = SPR_PRIO_MAX; j; j--, reqlist++) for (SprArgs& k : *reqlist) if (k.sprite_draw_param_index >= 0) - draw_sprite(this, rctx, k, mat, x_min, y_min, x_max, y_max, overlay_tex); - gl_rend_state.bind_vertex_array(0); + draw_sprite(rend_data_ctx, this, k, mat, x_min, y_min, x_max, y_max, overlay_tex); + rend_data_ctx.state.bind_vertex_array(0); } if (index == 2 && resolution_mode != RESOLUTION_MODE_MAX) res_window_get()->resolution_mode = mode; - draw_sprite_end(); + draw_sprite_end(rend_data_ctx); } SprSet* SpriteManager::GetSet(uint32_t index) { @@ -1788,7 +1795,8 @@ namespace spr { args_array[i]->sprite_draw_param_index = -1; } - static void draw_sprite(spr::SpriteManager* sprite_manager, render_context* rctx, const SprArgs& args, + static void draw_sprite(render_data_context& rend_data_ctx, + spr::SpriteManager* sprite_manager, const SprArgs& args, const mat4& mat, int32_t x_min, int32_t y_min, int32_t x_max, int32_t y_max, texture* overlay_tex) { sprite_draw_param& draw_param = sprite_manager->render_data.draw_param_buffer.data()[args.sprite_draw_param_index]; @@ -1796,8 +1804,9 @@ namespace spr { int32_t combiner = 0; if (draw_param.attrib.m.enable_blend) { if (draw_param.attrib.m.blend == 5) { - gl_rend_state.active_bind_texture_2d(7, overlay_tex->glid); - draw_sprite_copy_overlay_texture(rctx, args, mat, draw_param.vtx, x_min, y_min, x_max, y_max); + rend_data_ctx.state.active_bind_texture_2d(7, overlay_tex->glid); + draw_sprite_copy_overlay_texture(rend_data_ctx, + args, mat, draw_param.vtx, x_min, y_min, x_max, y_max); combiner = 2; } else @@ -1805,11 +1814,11 @@ namespace spr { const GLenum* blend = spr_blend_param[draw_param.attrib.m.blend]; - gl_rend_state.enable_blend(); - gl_rend_state.set_blend_func_separate(blend[0], blend[1], blend[2], blend[3]); + rend_data_ctx.state.enable_blend(); + rend_data_ctx.state.set_blend_func_separate(blend[0], blend[1], blend[2], blend[3]); } else - gl_rend_state.disable_blend(); + rend_data_ctx.state.disable_blend(); if (draw_param.shader == SHADER_FT_SPRITE) { int32_t tex_0_type = 0; @@ -1832,49 +1841,50 @@ namespace spr { } } - uniform_value[U_TEX_0_TYPE] = tex_0_type; - uniform_value[U_TEX_1_TYPE] = tex_1_type; - uniform_value[U_COMBINER] = combiner; + rend_data_ctx.shader_flags.arr[U_TEX_0_TYPE] = tex_0_type; + rend_data_ctx.shader_flags.arr[U_TEX_1_TYPE] = tex_1_type; + rend_data_ctx.shader_flags.arr[U_COMBINER] = combiner; } if (draw_param.textures[0]) { - gl_rend_state.active_bind_texture_2d(0, draw_param.textures[0]->glid); - gl_rend_state.bind_sampler(0, rctx->sprite_samplers[draw_param.attrib.m.sampler]); + rend_data_ctx.state.active_bind_texture_2d(0, draw_param.textures[0]->glid); + rend_data_ctx.state.bind_sampler(0, rctx_ptr->sprite_samplers[draw_param.attrib.m.sampler]); if (draw_param.textures[1]) { - gl_rend_state.active_bind_texture_2d(1, draw_param.textures[1]->glid); - gl_rend_state.bind_sampler(1, rctx->sprite_samplers[draw_param.attrib.m.sampler]); + rend_data_ctx.state.active_bind_texture_2d(1, draw_param.textures[1]->glid); + rend_data_ctx.state.bind_sampler(1, rctx_ptr->sprite_samplers[draw_param.attrib.m.sampler]); } - else if (!gl_rend_state.texture_binding_2d[1]) - gl_rend_state.active_bind_texture_2d(1, rctx->empty_texture_2d->glid); + else + rend_data_ctx.state.active_bind_texture_2d(1, rctx_ptr->empty_texture_2d->glid); } else { - if (!gl_rend_state.texture_binding_2d[0]) - gl_rend_state.active_bind_texture_2d(0, rctx->empty_texture_2d->glid); - if (!gl_rend_state.texture_binding_2d[1]) - gl_rend_state.active_bind_texture_2d(1, rctx->empty_texture_2d->glid); + rend_data_ctx.state.active_bind_texture_2d(0, rctx_ptr->empty_texture_2d->glid); + rend_data_ctx.state.active_bind_texture_2d(1, rctx_ptr->empty_texture_2d->glid); } - shaders_ft.set(draw_param.shader); + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, draw_param.shader); if (draw_param.attrib.m.primitive != GL_TRIANGLES) - shaders_ft.draw_arrays(draw_param.attrib.m.primitive, draw_param.first, draw_param.count); + rend_data_ctx.state.draw_arrays( + draw_param.attrib.m.primitive, draw_param.first, draw_param.count); else - shaders_ft.draw_range_elements(draw_param.attrib.m.primitive, draw_param.start, draw_param.end, + rend_data_ctx.state.draw_range_elements( + draw_param.attrib.m.primitive, draw_param.start, draw_param.end, draw_param.count, GL_UNSIGNED_INT, (void*)draw_param.offset); } - static void draw_sprite_begin(render_context* rctx) { - gl_rend_state.disable_blend(); - gl_rend_state.active_bind_texture_2d(0, rctx->empty_texture_2d->glid); - gl_rend_state.bind_sampler(0, 0); - gl_rend_state.active_bind_texture_2d(1, rctx->empty_texture_2d->glid); - gl_rend_state.bind_sampler(1, 0); - gl_rend_state.bind_sampler(7, 0); - gl_rend_state.set_blend_func_separate(GL_ONE, GL_ZERO, GL_ONE, GL_ZERO); + static void draw_sprite_begin(render_data_context& rend_data_ctx) { + rend_data_ctx.state.disable_blend(); + rend_data_ctx.state.active_bind_texture_2d(0, rctx_ptr->empty_texture_2d->glid); + rend_data_ctx.state.bind_sampler(0, 0); + rend_data_ctx.state.active_bind_texture_2d(1, rctx_ptr->empty_texture_2d->glid); + rend_data_ctx.state.bind_sampler(1, 0); + rend_data_ctx.state.bind_sampler(7, 0); + rend_data_ctx.state.set_blend_func_separate(GL_ONE, GL_ZERO, GL_ONE, GL_ZERO); } - static void draw_sprite_copy_overlay_texture(render_context* rctx, const SprArgs& args, const mat4& mat, - const vec3* vtx, int32_t overlay_x_min, int32_t overlay_y_min, int32_t overlay_x_max, int32_t overlay_y_max) { + static void draw_sprite_copy_overlay_texture( + render_data_context& rend_data_ctx, const SprArgs& args, const mat4& mat, const vec3* vtx, + int32_t overlay_x_min, int32_t overlay_y_min, int32_t overlay_x_max, int32_t overlay_y_max) { if (args.num_vertex || args.kind != SPR_KIND_NORMAL) return; @@ -1929,21 +1939,21 @@ namespace spr { const int32_t width = x_max - x_min + 1; const int32_t height = y_max - y_min + 1; if (width * height > 0) { - gl_rend_state.active_texture(7); + rend_data_ctx.state.active_texture(7); glCopyTexSubImage2D(GL_TEXTURE_2D, 0, x_min, y_min, x_min, y_min, width, height); } } - static void draw_sprite_end() { - gl_rend_state.disable_blend(); - gl_rend_state.active_bind_texture_2d(0, 0); - gl_rend_state.bind_sampler(0, 0); - gl_rend_state.active_bind_texture_2d(1, 0); - gl_rend_state.bind_sampler(1, 0); - gl_rend_state.active_bind_texture_2d(7, 0); - gl_rend_state.bind_sampler(7, 0); - gl_rend_state.set_blend_func_separate(GL_ONE, GL_ZERO, GL_ONE, GL_ZERO); - shader::unbind(); + static void draw_sprite_end(render_data_context& rend_data_ctx) { + rend_data_ctx.state.disable_blend(); + rend_data_ctx.state.active_bind_texture_2d(0, 0); + rend_data_ctx.state.bind_sampler(0, 0); + rend_data_ctx.state.active_bind_texture_2d(1, 0); + rend_data_ctx.state.bind_sampler(1, 0); + rend_data_ctx.state.active_bind_texture_2d(7, 0); + rend_data_ctx.state.bind_sampler(7, 0); + rend_data_ctx.state.set_blend_func_separate(GL_ONE, GL_ZERO, GL_ONE, GL_ZERO); + shader::unbind(rend_data_ctx.state); } static void draw_sprite_scale(spr::SprArgs* args) { diff --git a/src/CRE/sprite.hpp b/src/CRE/sprite.hpp index d6737182..b99e4f54 100644 --- a/src/CRE/sprite.hpp +++ b/src/CRE/sprite.hpp @@ -14,7 +14,6 @@ #include "../KKdLib/spr.hpp" #include "../KKdLib/vec.hpp" #include "color.hpp" -#include "render_context.hpp" #include "resolution_mode.hpp" #include "texture.hpp" #include "gl_rend_state.hpp" @@ -211,7 +210,8 @@ namespace spr { extern void sprite_manager_init(); extern void sprite_manager_add_spr_sets(const sprite_database* spr_db); extern void sprite_manager_clear(); -extern void sprite_manager_draw(int32_t index, bool font, texture* overlay_tex, const mat4& vp); +extern void sprite_manager_draw(struct render_data_context& rend_data_ctx, + int32_t index, bool font, texture* overlay_tex, const mat4& vp); extern int32_t sprite_manager_get_index(); extern size_t sprite_manager_get_reqlist_count(int32_t index); extern ::spr_set* sprite_manager_get_set(uint32_t set_id, const sprite_database* spr_db); diff --git a/src/CRE/static_var.cpp b/src/CRE/static_var.cpp index bb96903a..58962efc 100644 --- a/src/CRE/static_var.cpp +++ b/src/CRE/static_var.cpp @@ -18,9 +18,7 @@ int32_t sv_anisotropy = 1; bool sv_better_reflect = false; -bool sv_shared_storage_uniform_buffer = true; - -int32_t uniform_value[U_MAX]; +bool sv_shared_storage_uniform_buffer = false; const vec3 sv_rgb_to_luma = { 0.2126f, 0.7152f, 0.0722f @@ -44,22 +42,3 @@ void sv_anisotropy_set(int32_t value) { sv_anisotropy_changed = true; sv_old_anisotropy = sv_anisotropy; } - -void uniform_value_reset() { - uniform_value[U_ANISO] = 0; - uniform_value[U0B] = 0; - uniform_value[U_TEXTURE_BLEND] = 0; - uniform_value[U_FOG_STAGE] = 0; - uniform_value[U_FOG_CHARA] = 0; - uniform_value[U_SPECULAR_IBL] = 0; - uniform_value[U_TEX_0_TYPE] = 0; - uniform_value[U_TEX_1_TYPE] = 0; - uniform_value[U_TEXTURE_COUNT] = 0; - uniform_value[U_ENV_MAP] = 0; - uniform_value[U_TRANSLUCENCY] = 0; - uniform_value[U_NORMAL] = 0; - uniform_value[U_TRANSPARENCY] = 0; - uniform_value[U_STAGE_SHADOW] = 0; - uniform_value[U_SPECULAR] = 0; - uniform_value[U45] = 0; -} diff --git a/src/CRE/static_var.hpp b/src/CRE/static_var.hpp index ce5a9f95..07c72113 100644 --- a/src/CRE/static_var.hpp +++ b/src/CRE/static_var.hpp @@ -97,6 +97,10 @@ enum uniform_name { U_DOF_STAGE = U_TEX_1_TYPE, }; +struct uniform_value { + int32_t arr[U_MAX]; +}; + extern int32_t sv_max_texture_size; extern int32_t sv_max_texture_max_anisotropy; extern int32_t sv_max_uniform_buffer_size; @@ -111,11 +115,8 @@ extern bool sv_better_reflect; extern bool sv_shared_storage_uniform_buffer; -extern int32_t uniform_value[U_MAX]; - extern const vec3 sv_rgb_to_luma; extern const mat3 sv_rgb_to_ypbpr; extern const mat3 sv_ypbpr_to_rgb; extern void sv_anisotropy_set(int32_t value); -extern void uniform_value_reset(); diff --git a/src/CRE/texture.cpp b/src/CRE/texture.cpp index 3d5626f5..6db9649b 100644 --- a/src/CRE/texture.cpp +++ b/src/CRE/texture.cpp @@ -4,7 +4,7 @@ */ #include "texture.hpp" -#include "gl_rend_state.hpp" +#include "gl_state.hpp" #include "shared.hpp" #include "static_var.hpp" @@ -582,7 +582,14 @@ inline void texture_manager_free() { } inline static void texture_bind(GLenum target, GLuint texture) { - glBindTexture(target, texture); + switch (target) { + case GL_TEXTURE_2D: + gl_state.bind_texture_2d(texture); + break; + case GL_TEXTURE_CUBE_MAP: + gl_state.bind_texture_cube_map(texture); + break; + } } inline static GLuint texture_get_working_internal_format(GLuint internal_format) { diff --git a/src/KKdLib/mat.cpp b/src/KKdLib/mat.cpp index 9dc1ea14..aae62cc3 100644 --- a/src/KKdLib/mat.cpp +++ b/src/KKdLib/mat.cpp @@ -1956,6 +1956,19 @@ inline void mat4_ortho(float_t left, float_t right, out_m->row3.w = 1.0f; } +inline void mat4_ortho_offset(float_t left, float_t right, + float_t bottom, float_t top, float_t z_near, float_t z_far, + const vec2* scale, const vec2* offset, mat4* out_m) { + *out_m = mat4_null; + out_m->row0.x = 2.0f / (right - left) * scale->x; + out_m->row1.y = 2.0f / (top - bottom) * scale->y; + out_m->row2.z = -2.0f / (z_far - z_near); + out_m->row3.x = -((right + left) / (right - left)) * scale->x + offset->x; + out_m->row3.y = -((top + bottom) / (top - bottom)) * scale->y + offset->y; + out_m->row3.z = -((z_far + z_near) / (z_far - z_near)); + out_m->row3.w = 1.0f; +} + inline void mat4_persp(float_t fov_y, float_t aspect, float_t z_near, float_t z_far, mat4* out_m) { float_t tan_fov = tanf(fov_y * 0.5f); @@ -1967,6 +1980,15 @@ inline void mat4_persp(float_t fov_y, float_t aspect, float_t z_near, float_t z_ out_m->row3.z = -((2.0f * z_far * z_near) / (z_far - z_near)); } +inline void mat4_persp_offset(float_t fov_y, float_t aspect, float_t z_near, float_t z_far, + const vec2* scale, const vec2* offset, mat4* out_m) { + mat4_persp(fov_y, aspect, z_near, z_far, out_m); + *(vec2*)&out_m->row0.x = *(vec2*)&out_m->row0.x * *scale + out_m->row0.w * *offset; + *(vec2*)&out_m->row1.x = *(vec2*)&out_m->row1.x * *scale + out_m->row1.w * *offset; + *(vec2*)&out_m->row2.x = *(vec2*)&out_m->row2.x * *scale + out_m->row2.w * *offset; + *(vec2*)&out_m->row3.x = *(vec2*)&out_m->row3.x * *scale + out_m->row3.w * *offset; +} + inline void mat4_look_at(const vec3* eye, const vec3* target, const vec3* up, mat4* out_m) { vec3 x_axis, y_axis, z_axis; vec3 xyz; diff --git a/src/KKdLib/mat.hpp b/src/KKdLib/mat.hpp index 316fa207..9fd096d5 100644 --- a/src/KKdLib/mat.hpp +++ b/src/KKdLib/mat.hpp @@ -218,7 +218,12 @@ extern void mat4_frustrum(float_t left, float_t right, float_t bottom, float_t top, float_t z_near, float_t z_far, mat4* out_m); extern void mat4_ortho(float_t left, float_t right, float_t bottom, float_t top, float_t z_near, float_t z_far, mat4* out_m); +extern void mat4_ortho_offset(float_t left, float_t right, + float_t bottom, float_t top, float_t z_near, float_t z_far, + const vec2* scale, const vec2* offset, mat4* out_m); extern void mat4_persp(float_t fov_y, float_t aspect, float_t z_near, float_t z_far, mat4* out_m); +extern void mat4_persp_offset(float_t fov_y, float_t aspect, float_t z_near, float_t z_far, + const vec2* scale, const vec2* offset, mat4* out_m); extern void mat4_look_at(const vec3* eye, const vec3* target, const vec3* up, mat4* out_m); extern void mat4_look_at(const vec3* eye, const vec3* target, mat4* out_m); diff --git a/src/ReDIVA/app.cpp b/src/ReDIVA/app.cpp index dafecf3d..f38018d6 100644 --- a/src/ReDIVA/app.cpp +++ b/src/ReDIVA/app.cpp @@ -27,6 +27,7 @@ #include "../CRE/file_handler.hpp" #include "../CRE/font.hpp" #include "../CRE/gl_rend_state.hpp" +#include "../CRE/gl_state.hpp" #include "../CRE/hand_item.hpp" #include "../CRE/light_param.hpp" #include "../CRE/mdata_manager.hpp" @@ -450,12 +451,29 @@ int32_t app_main(const app_init_struct& ais) { #if !(BAKE_PNG || BAKE_VIDEO) glfwGetFramebufferSize(window, &width, &height); #endif - gl_rend_state.set_viewport(0, 0, width, height); - gl_rend_state.disable_blend(); - gl_rend_state.disable_depth_test(); - gl_rend_state.set_depth_mask(GL_FALSE); - gl_rend_state.disable_cull_face(); - gl_rend_state.disable_stencil_test(); + + if (Vulkan::use) { + Vulkan::CommandBuffer cb; + cb.Create(vulkan_device, vulkan_command_pool); + cb.BeginOneTimeSubmit(); + Vulkan::current_command_buffer = cb; + } + + render_data_context rend_data_ctx(0); + rend_data_ctx.state.set_viewport(0, 0, width, height); + rend_data_ctx.state.disable_blend(); + rend_data_ctx.state.disable_depth_test(); + rend_data_ctx.state.set_depth_mask(GL_FALSE); + rend_data_ctx.state.disable_cull_face(); + rend_data_ctx.state.disable_stencil_test(); + + if (Vulkan::use) { + Vulkan::CommandBuffer cb(vulkan_device, + vulkan_command_pool, Vulkan::current_command_buffer); + Vulkan::current_command_buffer = 0; + cb.Sumbit(vulkan_graphics_queue); + cb.Destroy(); + } glfwSwapInterval(0); @@ -528,9 +546,6 @@ bool app_render_data::load() { d3d_gl_handle = wglDXOpenDeviceNV(d3d_device); #endif - gl_get_error_print(); - gl_rend_state.set_viewport(0, 0, width, height); - #if DISPLAY_IBL const float_t box_vertices[] = { -1.0f, 1.0f, -1.0f, @@ -577,16 +592,16 @@ bool app_render_data::load() { }; glGenVertexArrays(1, &ibl_vao); - gl_rend_state.bind_vertex_array(ibl_vao, true); + gl_state.bind_vertex_array(ibl_vao, true); ibl_vbo.Create(sizeof(box_vertices), box_vertices); - ibl_vbo.Bind(true); + gl_state.bind_array_buffer(ibl_vbo.Bind); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float_t) * 3, (void*)0); - gl_rend_state.bind_array_buffer(0); - gl_rend_state.bind_vertex_array(0); + gl_state.bind_array_buffer(0); + gl_state.bind_vertex_array(0); cubemap_display_ubo.Create(sizeof(cubemap_display_batch_shader_data)); #endif @@ -749,7 +764,9 @@ static render_context* render_context_load() { render_context* rctx = new render_context; rctx_ptr = rctx; - gl_rend_state.get(); + gl_state.get(); + render_data_context rend_data_ctx(0); + rend_data_ctx.state.get(); data_struct* aft_data = &data_list[DATA_AFT]; aet_database* aft_aet_db = &aft_data->data_ft.aet_db; @@ -1276,7 +1293,7 @@ static render_context* render_context_load() { cam->set_view_point({ 0.0f, 1.4f, 1.0f }); cam->set_interest({ 0.0f, 1.4f, 0.0f }); - uniform_value[U16] = 1; + rend_data_ctx.shader_flags.arr[U16] = 1; imgui_context = ImGui::CreateContext(); ImGui::SetCurrentContext(imgui_context); @@ -1386,14 +1403,7 @@ static void render_context_ctrl(render_context* rctx) { camera* cam = rctx->camera; - for (int32_t i = 0; i < 32; i++) { - if (!gl_rend_state.check_texture_binding_2d(i) && !gl_rend_state.check_texture_binding_cube_map(i)) - continue; - - gl_rend_state.active_bind_texture_2d(i, 0); - gl_rend_state.active_bind_texture_cube_map(i, 0); - gl_rend_state.bind_sampler(i, 0); - } + gl_state.get(); global_context_menu = true; ImGui::SetCurrentContext(imgui_context); @@ -1536,30 +1546,24 @@ static void render_context_disp(render_context* rctx) { static const GLfloat depth_clear = 1.0f; static const GLint stencil_clear = 0; - for (int32_t i = 0; i < 32; i++) { - if (!gl_rend_state.check_texture_binding_2d(i) && !gl_rend_state.check_texture_binding_cube_map(i)) - continue; - - gl_rend_state.active_bind_texture_2d(i, 0); - gl_rend_state.active_bind_texture_cube_map(i, 0); - gl_rend_state.bind_sampler(i, 0); - } - - gl_rend_state.bind_framebuffer(0); - gl_rend_state.set_depth_mask(GL_TRUE); - gl_rend_state.set_stencil_mask(0xFF); + render_data_context pre_rend_data_ctx(0); + pre_rend_data_ctx.state.get(); + pre_rend_data_ctx.state.set_depth_mask(GL_TRUE); + pre_rend_data_ctx.state.set_stencil_mask(0xFF); glClearBufferfv(GL_COLOR, 0, (float_t*)&color_clear); glClearDepthf(depth_clear); - gl_rend_state.set_stencil_mask(0x00); - gl_rend_state.set_depth_mask(GL_FALSE); + pre_rend_data_ctx.state.set_stencil_mask(0x00); + pre_rend_data_ctx.state.set_depth_mask(GL_FALSE); - gl_rend_state.set_viewport(0, 0, internal_3d_res.x, internal_3d_res.y); + pre_rend_data_ctx.state.set_viewport(0, 0, internal_3d_res.x, internal_3d_res.y); rctx->disp(); + render_data_context post_rend_data_ctx(3); + #if DISPLAY_IBL if (display_ibl) { - rctx->screen_buffer.Bind(); + rctx->screen_buffer.Bind(post_rend_data_ctx.state); mat4 mat; mat4_translate_y(1.4f, &mat); @@ -1576,15 +1580,15 @@ static void render_context_disp(render_context* rctx) { shader_data.g_vp[3] = mat.row3; shader_data.g_texture_lod.x = ibl_index == 1 ? 1.0f : 0.0f; shader_data.g_texture_lod.y = 1.0f / (float_t)ibl_scale; - rctx_ptr->glitter_batch_ubo.WriteMemory(shader_data); + rctx_ptr->glitter_batch_ubo.WriteMemory(post_rend_data_ctx.state, shader_data); - rctx_ptr->glitter_batch_ubo.Bind(3); - shaders_dev.set(SHADER_DEV_CUBEMAP_DISPLAY); - gl_rend_state.bind_vertex_array(ibl_vao); - gl_rend_state.active_bind_texture_cube_map(0, - light_param_data_storage_data_get_ibl_texture(max_def(ibl_index - 1, 0))); - shaders_dev.draw_arrays(GL_TRIANGLES, 0, 36); - gl_rend_state.bind_vertex_array(0); + post_rend_data_ctx.state.bind_uniform_buffer_base(3, rctx_ptr->glitter_batch_ubo); + shaders_dev.set(post_rend_data_ctx.state, post_rend_data_ctx.shader_flags, SHADER_DEV_CUBEMAP_DISPLAY); + post_rend_data_ctx.state.bind_vertex_array(ibl_vao); + post_rend_data_ctx.state.active_bind_texture_cube_map(0, + light_param_data_storage_data_get_ibl_textures()[max_def(ibl_index - 1, 0)]); + post_rend_data_ctx.state.draw_arrays(GL_TRIANGLES, 0, 36); + post_rend_data_ctx.state.bind_vertex_array(0); } #endif @@ -1592,28 +1596,28 @@ static void render_context_disp(render_context* rctx) { Vulkan::end_render_pass(Vulkan::current_command_buffer); #if BAKE_PNG || BAKE_VIDEO - gl_rend_state.set_viewport(0, 0, rctx->screen_width, rctx->screen_height); + post_rend_data_ctx.state.set_viewport(0, 0, rctx->screen_width, rctx->screen_height); #else - gl_rend_state.set_viewport(rctx->screen_x_offset, rctx->screen_y_offset, + post_rend_data_ctx.state.set_viewport(rctx->screen_x_offset, rctx->screen_y_offset, rctx->sprite_width, rctx->sprite_height); #endif - gl_rend_state.bind_framebuffer(0); - gl_rend_state.active_bind_texture_2d(0, rctx->screen_buffer.GetColorTex()); - uniform_value[U_ALPHA_MASK] = 0; - uniform_value[U_REDUCE] = 0; - shaders_ft.set(SHADER_FT_REDUCE); - rctx->render.draw_quad(rctx->sprite_width, rctx->sprite_height, + post_rend_data_ctx.state.bind_framebuffer(0); + post_rend_data_ctx.state.active_bind_texture_2d(0, rctx->screen_buffer.GetColorTex()); + post_rend_data_ctx.shader_flags.arr[U_ALPHA_MASK] = 0; + post_rend_data_ctx.shader_flags.arr[U_REDUCE] = 0; + shaders_ft.set(post_rend_data_ctx.state, post_rend_data_ctx.shader_flags, SHADER_FT_REDUCE); + rctx->render.draw_quad(post_rend_data_ctx, rctx->sprite_width, rctx->sprite_height, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); } #ifdef USE_OPENGL else { #if BAKE_PNG || BAKE_VIDEO - fbo_blit(rctx->screen_buffer.fbos[0], 0, + fbo_blit(post_rend_data_ctx.state, rctx->screen_buffer.fbos[0], 0, 0, 0, rctx->sprite_width, rctx->sprite_height, 0, 0, rctx->screen_width, rctx->screen_height, GL_COLOR_BUFFER_BIT, GL_LINEAR); #else - fbo_blit(rctx->screen_buffer.fbos[0], 0, + fbo_blit(post_rend_data_ctx.state, rctx->screen_buffer.fbos[0], 0, 0, 0, rctx->sprite_width, rctx->sprite_height, rctx->screen_x_offset, rctx->screen_y_offset, rctx->sprite_width, rctx->sprite_height, GL_COLOR_BUFFER_BIT, GL_LINEAR); diff --git a/src/ReDIVA/graphics/shadow.cpp b/src/ReDIVA/graphics/shadow.cpp index 8827a3ea..914ee529 100644 --- a/src/ReDIVA/graphics/shadow.cpp +++ b/src/ReDIVA/graphics/shadow.cpp @@ -217,6 +217,7 @@ void ShadowDw::ShowTextureCallback(dw::Widget* data) { dw::Button* button = dynamic_cast(data); if (button) { shadow_dw->shadow_ptr->show_texture = button->value; - shadow_dw->shadow_ptr->clear_textures(); + render_data_context rend_data_ctx(0); + shadow_dw->shadow_ptr->clear_textures(rend_data_ctx.state); } } diff --git a/src/ReDIVA/x_pv_game.cpp b/src/ReDIVA/x_pv_game.cpp index d65a6a07..3154f314 100644 --- a/src/ReDIVA/x_pv_game.cpp +++ b/src/ReDIVA/x_pv_game.cpp @@ -12,6 +12,7 @@ #include "../CRE/app_system_detail.hpp" #include "../CRE/data.hpp" #include "../CRE/effect.hpp" +#include "../CRE/gl_state.hpp" #include "../CRE/item_table.hpp" #include "../CRE/object.hpp" #include "../CRE/pv_expression.hpp" @@ -6336,11 +6337,11 @@ struct d3d_gl_fbo_tex_struct { handle = wglDXRegisterObjectNV(d3d_gl_handle, d3d_tex, gl_tex, GL_TEXTURE_2D, WGL_ACCESS_READ_WRITE_NV); else { - gl_rend_state.bind_texture_2d(gl_tex); + gl_state.bind_texture_2d(gl_tex); ::texture* tex = rctx_ptr->screen_buffer.color_texture; glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, tex->width, tex->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); - gl_rend_state.bind_texture_2d(0); + gl_state.bind_texture_2d(0); } glGenFramebuffers(1, &gl_fbo); @@ -6348,9 +6349,9 @@ struct d3d_gl_fbo_tex_struct { return; lock(); - gl_rend_state.bind_framebuffer(gl_fbo); + gl_state.bind_framebuffer(gl_fbo); glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, gl_tex, 0); - gl_rend_state.bind_framebuffer(0); + gl_state.bind_framebuffer(0); unlock(); } @@ -6390,7 +6391,6 @@ struct d3d_gl_fbo_tex_struct { static d3d_gl_fbo_tex_struct d3d_gl_fbo_tex; #if BAKE_VIDEO_ALPHA -static ID3D11Texture2D* d3d_alpha_texture; static d3d_gl_fbo_tex_struct d3d_gl_alpha_fbo_tex; #endif @@ -6468,9 +6468,9 @@ bool x_pv_game::ctrl() { D3D11_MAPPED_SUBRESOURCE mapped_res = {}; if (SUCCEEDED(d3d_device_context->Map(d3d_gl_fbo_tex.d3d_tex, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped_res))) { - gl_rend_state.bind_texture_2d(d3d_gl_fbo_tex.gl_tex); + gl_state.bind_texture_2d(d3d_gl_fbo_tex.gl_tex); glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, nvenc_temp_pixels.data()); - gl_rend_state.bind_texture_2d(0); + gl_state.bind_texture_2d(0); uint8_t* src = (uint8_t*)nvenc_temp_pixels.data(); uint8_t* dst = (uint8_t*)mapped_res.pData; @@ -6491,9 +6491,9 @@ bool x_pv_game::ctrl() { D3D11_MAPPED_SUBRESOURCE mapped_alpha_res = {}; if (SUCCEEDED(d3d_device_context->Map(d3d_gl_alpha_fbo_tex.d3d_tex, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped_alpha_res))) { - gl_rend_state.bind_texture_2d(d3d_gl_alpha_fbo_tex.gl_tex); + gl_state.bind_texture_2d(d3d_gl_alpha_fbo_tex.gl_tex); glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, nvenc_temp_pixels.data()); - gl_rend_state.bind_texture_2d(0); + gl_state.bind_texture_2d(0); uint8_t* src = (uint8_t*)nvenc_temp_pixels.data(); uint8_t* dst = (uint8_t*)mapped_alpha_res.pData; @@ -6524,9 +6524,9 @@ bool x_pv_game::ctrl() { #elif BAKE_PNG std::vector temp_pixels; temp_pixels.resize((size_t)width * (size_t)height * 4 * sizeof(uint8_t)); - gl_rend_state.bind_texture_2d(tex->glid); + gl_state.bind_texture_2d(tex->glid); glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, temp_pixels.data()); - gl_rend_state.bind_texture_2d(0); + gl_state.bind_texture_2d(0); std::vector pixels; pixels.resize((size_t)width * (size_t)height * 4 * sizeof(uint8_t)); @@ -8000,11 +8000,6 @@ bool x_pv_game::ctrl() { #endif d3d_gl_fbo_tex.free(); -#if BAKE_VIDEO_ALPHA - d3d_alpha_texture->Release(); - d3d_alpha_texture = 0; -#endif - if (!GLAD_WGL_NV_DX_interop2) { nvenc_temp_pixels.clear(); nvenc_temp_pixels.shrink_to_fit(); @@ -8183,20 +8178,23 @@ void x_pv_game::basic() { #if BAKE_VIDEO d3d_gl_fbo_tex.lock(); - gl_rend_state.bind_framebuffer(d3d_gl_fbo_tex.gl_fbo); - gl_rend_state.active_bind_texture_2d(0, tex->glid); - gl_rend_state.bind_sampler(0, rctx_ptr->render_samplers[1]); + render_data_context rend_data_ctx(3); + rend_data_ctx.state.bind_framebuffer(d3d_gl_fbo_tex.gl_fbo); + rend_data_ctx.state.active_bind_texture_2d(0, tex->glid); + rend_data_ctx.state.bind_sampler(0, rctx_ptr->render_samplers[1]); #if BAKE_VIDEO_ALPHA GLint swizzle_rgb1[] = { GL_RED, GL_GREEN, GL_BLUE, GL_ONE }; glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle_rgb1); #endif - gl_rend_state.set_viewport(0, 0, width, height); + rend_data_ctx.state.set_viewport(0, 0, width, height); if (nvenc_rgb) - shaders_dev.set(SHADER_DEV_CONVERT_RGB); + shaders_dev.set(rend_data_ctx.state, + rend_data_ctx.shader_flags, SHADER_DEV_CONVERT_RGB); else - shaders_dev.set(SHADER_DEV_CONVERT_YCBCR_BT709); + shaders_dev.set(rend_data_ctx.state, + rend_data_ctx.shader_flags, SHADER_DEV_CONVERT_YCBCR_BT709); float_t s0 = 1.0f; float_t t0 = 0.0f; @@ -8214,48 +8212,50 @@ void x_pv_game::basic() { quad.g_color = 1.0f; quad.g_texture_lod = 0.0f; - rctx_ptr->quad_ubo.WriteMemory(quad); - rctx_ptr->quad_ubo.Bind(0); - gl_rend_state.bind_vertex_array(rctx_ptr->common_vao); - shaders_dev.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); + rctx_ptr->quad_ubo.WriteMemory(rend_data_ctx.state, quad); + rend_data_ctx.state.bind_uniform_buffer_base(0, rctx_ptr->quad_ubo); + rend_data_ctx.state.bind_vertex_array(rctx_ptr->common_vao); + rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); #if BAKE_VIDEO_ALPHA GLint swizzle_rgba[] = { GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA }; glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle_rgba); #endif - gl_rend_state.bind_sampler(0, 0); - gl_rend_state.bind_texture_2d(0); - gl_rend_state.bind_framebuffer(0); + rend_data_ctx.state.bind_sampler(0, 0); + rend_data_ctx.state.bind_texture_2d(0); + rend_data_ctx.state.bind_framebuffer(0); d3d_gl_fbo_tex.unlock(); #if BAKE_VIDEO_ALPHA d3d_gl_alpha_fbo_tex.lock(); - gl_rend_state.bind_framebuffer(d3d_gl_alpha_fbo_tex.gl_fbo); - gl_rend_state.active_bind_texture_2d(0, tex->glid); + rend_data_ctx.state.bind_framebuffer(d3d_gl_alpha_fbo_tex.gl_fbo); + rend_data_ctx.state.active_bind_texture_2d(0, tex->glid); if (nvenc_rgb) { GLint swizzle_aaa1[] = { GL_ALPHA, GL_ALPHA, GL_ALPHA, GL_ONE }; glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle_aaa1); } - gl_rend_state.set_viewport(0, 0, width, height); + rend_data_ctx.state.set_viewport(0, 0, width, height); if (nvenc_rgb) { - uniform_value[U_REDUCE] = 0; - shaders_ft.set(SHADER_FT_REDUCE); + rend_data_ctx.shader_flags.arr[U_REDUCE] = 0; + shaders_dev.set(rend_data_ctx.state, + rend_data_ctx.shader_flags, SHADER_FT_REDUCE); } else - shaders_dev.set(SHADER_DEV_CONVERT_ALPHA); - rctx_ptr->render.draw_quad(width, height, + shaders_dev.set(rend_data_ctx.state, + rend_data_ctx.shader_flags, SHADER_DEV_CONVERT_ALPHA); + rctx_ptr->render.draw_quad(rend_data_ctx, width, height, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); if (nvenc_rgb) glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle_rgba); - gl_rend_state.bind_texture_2d(0); - gl_rend_state.bind_framebuffer(0); + rend_data_ctx.state.bind_texture_2d(0); + rend_data_ctx.state.bind_framebuffer(0); d3d_gl_alpha_fbo_tex.unlock(); #endif