diff --git a/src/CRE/Vulkan/gl_wrap.cpp b/src/CRE/Vulkan/gl_wrap.cpp index e5d97fb9..05eb6ab3 100644 --- a/src/CRE/Vulkan/gl_wrap.cpp +++ b/src/CRE/Vulkan/gl_wrap.cpp @@ -74,6 +74,7 @@ namespace Vulkan { vec4 clear_color; float_t clear_depth; + int32_t clear_stencil; int32_t pack_alignment; int32_t unpack_alignment; GLuint query_samples_passed; @@ -122,6 +123,7 @@ namespace Vulkan { static void gl_wrap_manager_clear_buffer(GLenum buffer, GLint drawbuffer, const GLfloat* value); static void gl_wrap_manager_clear_color(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); static void gl_wrap_manager_clear_depth(GLfloat depth); + static void gl_wrap_manager_clear_stencil(GLint s); static void gl_wrap_manager_clear_named_framebuffer(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat* value); static void gl_wrap_manager_compressed_tex_image_2d(GLenum target, GLint level, @@ -963,7 +965,13 @@ namespace Vulkan { gl_state.scissor_box.height = 0; gl_state.scissor_test = GL_FALSE; gl_state.stencil_test = GL_FALSE; - gl_state.stencil_mask = 0xFFFFFFFF; + gl_state.stencil_func = GL_ALWAYS; + gl_state.stencil_fail = GL_KEEP; + gl_state.stencil_dpfail = GL_KEEP; + gl_state.stencil_dppass = GL_KEEP; + gl_state.stencil_mask = 0x01; + gl_state.stencil_ref = 0x00; + gl_state.stencil_value_mask = 0x01; gl_state.viewport.x = 0; gl_state.viewport.y = 0; gl_state.viewport.width = 0; @@ -1017,6 +1025,7 @@ namespace Vulkan { glClearBufferfv = gl_wrap_manager_clear_buffer; glClearColor = gl_wrap_manager_clear_color; glClearDepthf = gl_wrap_manager_clear_depth; + glClearStencil = gl_wrap_manager_clear_stencil; glCompressedTexImage2D = gl_wrap_manager_compressed_tex_image_2d; glCompressedTexSubImage2D = gl_wrap_manager_compressed_tex_sub_image_2d; glCopyImageSubData = gl_wrap_manager_copy_image_sub_data; @@ -1305,6 +1314,29 @@ namespace Vulkan { } } + VkStencilOp get_stencil_op(GLenum op) { + switch (op) { + case GL_KEEP: + return VK_STENCIL_OP_KEEP; + case GL_ZERO: + return VK_STENCIL_OP_ZERO; + case GL_REPLACE: + return VK_STENCIL_OP_REPLACE; + case GL_INCR: + return VK_STENCIL_OP_INCREMENT_AND_CLAMP; + case GL_DECR: + return VK_STENCIL_OP_DECREMENT_AND_CLAMP; + case GL_INVERT: + return VK_STENCIL_OP_INVERT; + case GL_INCR_WRAP: + return VK_STENCIL_OP_INCREMENT_AND_WRAP; + case GL_DECR_WRAP: + return VK_STENCIL_OP_DECREMENT_AND_WRAP; + default: + return VK_STENCIL_OP_MAX_ENUM; + } + } + gl_texture_data::tex_data::tex_data() { } @@ -1598,6 +1630,7 @@ namespace Vulkan { texture_counter(), vertex_array_counter(), query_samples_passed() { clear_color = 0.0f; clear_depth = 1.0f; + clear_stencil = 0x00; pack_alignment = 4; unpack_alignment = 4; } @@ -2295,7 +2328,7 @@ namespace Vulkan { } static void gl_wrap_manager_clear(GLbitfield mask) { - if (mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) { + if (mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) { gl_wrap_manager_ptr->push_error(GL_INVALID_VALUE); return; } @@ -2359,7 +2392,7 @@ namespace Vulkan { VkClearDepthStencilValue clear_depth_stencil_value; clear_depth_stencil_value.depth = gl_wrap_manager_ptr->clear_depth; - clear_depth_stencil_value.stencil = 0; + clear_depth_stencil_value.stencil = gl_wrap_manager_ptr->clear_stencil; VkImageSubresourceRange range; range.aspectMask = aspect_mask; @@ -2396,6 +2429,10 @@ namespace Vulkan { gl_wrap_manager_ptr->clear_depth = depth; } + static void gl_wrap_manager_clear_stencil(GLint s) { + gl_wrap_manager_ptr->clear_stencil = s; + } + static void gl_wrap_manager_clear_named_framebuffer(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat* value) { VkImageAspectFlags aspect_mask; @@ -3103,7 +3140,7 @@ namespace Vulkan { static void gl_wrap_manager_framebuffer_texture(GLenum target, GLenum attachment, GLuint texture, GLint level) { - if (target != GL_FRAMEBUFFER || attachment < GL_COLOR_ATTACHMENT0 + if (target != GL_FRAMEBUFFER || attachment < GL_COLOR_ATTACHMENT0 && attachment != GL_DEPTH_STENCIL_ATTACHMENT || (attachment > GL_COLOR_ATTACHMENT0 + Vulkan::MAX_COLOR_ATTACHMENTS && attachment != GL_DEPTH_ATTACHMENT)) { gl_wrap_manager_ptr->push_error(GL_INVALID_ENUM); @@ -3128,7 +3165,7 @@ namespace Vulkan { return; } - if (attachment == GL_DEPTH_ATTACHMENT) { + if (attachment == GL_DEPTH_ATTACHMENT || attachment == GL_DEPTH_STENCIL_ATTACHMENT) { vk_fbo->depth_attachment = texture; vk_fbo->depth_attachment_level = texture ? level : 0; vk_fbo->update_depth_attachment = true; @@ -3485,6 +3522,7 @@ namespace Vulkan { case GL_RGB: case GL_RGBA: case GL_DEPTH_COMPONENT: + case GL_DEPTH_STENCIL: break; default: gl_wrap_manager_ptr->push_error(GL_INVALID_ENUM); @@ -3920,6 +3958,7 @@ namespace Vulkan { case GL_RGB: case GL_RGBA: case GL_DEPTH_COMPONENT: + case GL_DEPTH_STENCIL: break; default: gl_wrap_manager_ptr->push_error(GL_INVALID_ENUM); @@ -3934,6 +3973,7 @@ namespace Vulkan { case GL_UNSIGNED_SHORT_5_6_5_REV: case GL_UNSIGNED_SHORT_4_4_4_4_REV: case GL_UNSIGNED_SHORT_1_5_5_5_REV: + case GL_UNSIGNED_INT_24_8: case GL_UNSIGNED_INT_10F_11F_11F_REV: break; default: @@ -3962,6 +4002,7 @@ namespace Vulkan { case GL_DEPTH_COMPONENT32F: break; default: + printf("e"); gl_wrap_manager_ptr->push_error(GL_INVALID_ENUM); return; } diff --git a/src/CRE/Vulkan/gl_wrap.hpp b/src/CRE/Vulkan/gl_wrap.hpp index ca9ebd50..10140b9a 100644 --- a/src/CRE/Vulkan/gl_wrap.hpp +++ b/src/CRE/Vulkan/gl_wrap.hpp @@ -242,4 +242,5 @@ namespace Vulkan { extern VkFormat get_format(GLenum internal_format); extern VkImageViewType get_image_view_type(GLenum target); extern VkPolygonMode get_polygon_mode(GLenum mode); + extern VkStencilOp get_stencil_op(GLenum op); } diff --git a/src/CRE/Vulkan/manager.cpp b/src/CRE/Vulkan/manager.cpp index 4122829f..1d955773 100644 --- a/src/CRE/Vulkan/manager.cpp +++ b/src/CRE/Vulkan/manager.cpp @@ -106,19 +106,16 @@ struct render_pass_data { uint64_t color_formats_hash; GLenum depth_format; bool depth_read_only; - bool stencil; - uint8_t pad[2]; + uint8_t pad[3]; - inline render_pass_data() : color_formats_hash(), depth_format(), depth_read_only(), stencil(), pad() { + inline render_pass_data() : color_formats_hash(), depth_format(), depth_read_only(), pad() { } - inline render_pass_data(uint64_t color_formats_hash, GLenum depth_format, - bool depth_read_only, bool stencil) : pad() { + inline render_pass_data(uint64_t color_formats_hash, GLenum depth_format, bool depth_read_only) : pad() { this->color_formats_hash = color_formats_hash; this->depth_format = depth_format; this->depth_read_only = depth_read_only; - this->stencil = stencil; } }; @@ -132,7 +129,7 @@ public: constexpr bool operator==(const render_pass_data& left, const render_pass_data& right) { return left.color_formats_hash == right.color_formats_hash - && left.depth_format == right.depth_format && left.stencil == right.stencil; + && left.depth_format == right.depth_format; } namespace Vulkan { @@ -221,7 +218,7 @@ namespace Vulkan { const VkPipelineColorBlendAttachmentState* color_blend_attachments, VkPipelineLayout layout, VkRenderPass render_pass); prj::shared_ptr get_render_pass(GLenum* color_formats, - uint32_t color_format_count, GLenum depth_format, bool depth_read_only, bool stencil); + uint32_t color_format_count, GLenum depth_format, bool depth_read_only); prj::shared_ptr get_sampler(const gl_sampler& sampler_data); Vulkan::Buffer get_dynamic_buffer(VkDeviceSize size, VkDeviceSize alignment); Vulkan::Buffer get_staging_buffer(VkDeviceSize size, VkDeviceSize alignment); @@ -302,9 +299,9 @@ namespace Vulkan { prj::shared_ptr manager_get_render_pass( GLenum* color_formats, uint32_t color_format_count, - GLenum depth_format, bool depth_read_only, bool stencil) { + GLenum depth_format, bool depth_read_only) { return manager_ptr->get_render_pass(color_formats, - color_format_count, depth_format, depth_read_only, stencil); + color_format_count, depth_format, depth_read_only); } prj::shared_ptr manager_get_sampler(const gl_sampler& sampler_data) { @@ -517,11 +514,11 @@ namespace Vulkan { } prj::shared_ptr manager::get_render_pass(GLenum* color_formats, - uint32_t color_format_count, GLenum depth_format, bool depth_read_only, bool stencil) { + uint32_t color_format_count, GLenum depth_format, bool depth_read_only) { uint64_t color_formats_hash = hash_xxh3_64bits(color_formats, sizeof(GLenum) * color_format_count); - auto elem = render_passes.find({ color_formats_hash, depth_format, depth_read_only, stencil }); + auto elem = render_passes.find({ color_formats_hash, depth_format, depth_read_only }); if (elem != render_passes.end()) return elem->second; @@ -593,6 +590,7 @@ namespace Vulkan { } if (depth_format) { + const bool stencil = depth_format == GL_DEPTH24_STENCIL8; VkAttachmentDescription& depth_attachment = attachments[attachment_count]; depth_attachment.flags = 0; depth_attachment.format = Vulkan::get_format(depth_format); @@ -615,7 +613,7 @@ namespace Vulkan { prj::shared_ptr render_pass(new Vulkan::RenderPass(Vulkan::current_device, 0, attachment_count, attachments, 1, &subpass_description, 1, &subpass_dependency)); - render_passes.insert({ { color_formats_hash, depth_format, depth_read_only, stencil }, render_pass }); + render_passes.insert({ { color_formats_hash, depth_format, depth_read_only }, render_pass }); free_def(attachments); free_def(color_attachment_reference); diff --git a/src/CRE/Vulkan/manager.hpp b/src/CRE/Vulkan/manager.hpp index 920dd32c..cd708a2e 100644 --- a/src/CRE/Vulkan/manager.hpp +++ b/src/CRE/Vulkan/manager.hpp @@ -45,7 +45,7 @@ namespace Vulkan { VkPipelineLayout layout, VkRenderPass render_pass); extern prj::shared_ptr manager_get_render_pass( GLenum* color_formats, uint32_t color_format_count, - GLenum depth_format, bool depth_read_only, bool stencil = false); + GLenum depth_format, bool depth_read_only); extern prj::shared_ptr manager_get_sampler(const gl_sampler& sampler_data); Vulkan::Buffer manager_get_dynamic_buffer(VkDeviceSize size, VkDeviceSize alignment); Vulkan::Buffer manager_get_staging_buffer(VkDeviceSize size, VkDeviceSize alignment = 0x40); diff --git a/src/CRE/gl_state.cpp b/src/CRE/gl_state.cpp index e5d65735..f6636054 100644 --- a/src/CRE/gl_state.cpp +++ b/src/CRE/gl_state.cpp @@ -49,7 +49,9 @@ void gl_state_active_texture(size_t index, bool force) { } void gl_state_bind_framebuffer(GLuint framebuffer, bool force) { - if (force || gl_state.framebuffer_binding != framebuffer) { + if (force || gl_state.framebuffer_binding != framebuffer + || gl_state.read_framebuffer_binding != framebuffer + || gl_state.draw_framebuffer_binding != framebuffer) { #ifdef USE_OPENGL if (!Vulkan::use) glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); diff --git a/src/CRE/render_manager.cpp b/src/CRE/render_manager.cpp index b1694308..e05eaedd 100644 --- a/src/CRE/render_manager.cpp +++ b/src/CRE/render_manager.cpp @@ -24,7 +24,7 @@ #include "static_var.hpp" #include "texture.hpp" -#define REFLECT_STENCIL (0) +#define REFLECT_STENCIL (1) 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); @@ -499,7 +499,12 @@ namespace rndr { //} glClearColor(sss->param.x, sss->param.y, sss->param.z, 0.0f); +#if REFLECT_STENCIL + glClearStencil(0x00); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); +#else glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); +#endif draw_pass_set_camera(); for (int32_t i = LIGHT_SET_MAIN; i < LIGHT_SET_MAX; i++) @@ -688,33 +693,52 @@ namespace rndr { rctx->fog[i].data_set((fog_id)i); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); +#if REFLECT_STENCIL + glClearStencil(0x00); +#endif if (sv_better_reflect && rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_SSS)) glClear(GL_COLOR_BUFFER_BIT); else +#if REFLECT_STENCIL + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); +#else glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); +#endif #if REFLECT_STENCIL if (sv_better_reflect) { gl_state_set_stencil_mask(0xFF); - glClearStencil(0x00); - glClear(GL_STENCIL_BUFFER_BIT); - rctx->draw_state->shader_index = SHADER_FT_SIL; gl_state_disable_depth_test(); gl_state_set_depth_func(GL_LEQUAL); gl_state_set_depth_mask(GL_TRUE); - gl_state_enable_stencil_test(); - gl_state_set_stencil_op(GL_KEEP, GL_KEEP, GL_REPLACE); - gl_state_set_stencil_func(GL_ALWAYS, 0x01, 0xFF); - - gl_state_set_color_mask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); draw_pass_reflect_stencil(rctx, mdl::OBJ_TYPE_OPAQUE); draw_pass_reflect_stencil(rctx, mdl::OBJ_TYPE_TRANSLUCENT); draw_pass_reflect_stencil(rctx, mdl::OBJ_TYPE_TRANSLUCENT_SORT_BY_RADIUS); draw_pass_reflect_stencil(rctx, mdl::OBJ_TYPE_TRANSPARENT); + + fbo_blit(refl_tex.fbos[0], refl_buf_tex.fbos[0], + 0, 0, refl_tex.GetWidth(), refl_tex.GetHeight(), + 0, 0, refl_buf_tex.GetWidth(), refl_buf_tex.GetHeight(), + GL_COLOR_BUFFER_BIT, GL_LINEAR); + + refl_tex.Bind(); + glClear(GL_COLOR_BUFFER_BIT); + + gl_state_enable_stencil_test(); + gl_state_set_stencil_op(GL_KEEP, GL_KEEP, GL_REPLACE); + gl_state_set_stencil_func(GL_ALWAYS, 0x01, 0x01); + + gl_state_bind_texture_2d(refl_buf_tex.GetColorTex()); + gl_state_bind_sampler(0, rctx->render_samplers[0]); + + gl_state_set_color_mask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); + shaders_ft.set(SHADER_FT_REFLECT_STENCIL); + rctx->render.draw_quad(refl_buf_tex.GetWidth(), refl_buf_tex.GetHeight(), 1.0f, 1.0f, + 0.0f, 0.0f, 6.0f, 1.0f, 1.0f, 1.0f, 1.0f); gl_state_set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); gl_state_set_stencil_op(GL_KEEP, GL_KEEP, GL_KEEP); @@ -2066,9 +2090,7 @@ static void draw_pass_reflect_stencil(render_context* rctx, mdl::ObjType type) { case SHADER_FT_WATER01: case SHADER_FT_FLOOR: case SHADER_FT_PUDDLE: - mat4 mat; - mat4_scale_rot(&i->mat, 1.1f, &mat); - draw_sub_mesh(rctx, &i->args.sub_mesh, &mat, mdl::draw_sub_mesh_default); + draw_sub_mesh(rctx, &i->args.sub_mesh, &i->mat, mdl::draw_sub_mesh_default); break; } } break; @@ -2078,9 +2100,7 @@ static void draw_pass_reflect_stencil(render_context* rctx, mdl::ObjType type) { case SHADER_FT_WATER01: case SHADER_FT_FLOOR: case SHADER_FT_PUDDLE: - mat4 mat; - mat4_scale_rot(&i->mat, 1.1f, &mat); - draw_sub_mesh(rctx, i->args.translucent.sub_mesh[j], &mat, mdl::draw_sub_mesh_default); + draw_sub_mesh(rctx, i->args.translucent.sub_mesh[j], &i->mat, mdl::draw_sub_mesh_default); break; } } break; diff --git a/src/CRE/shader.cpp b/src/CRE/shader.cpp index e3dc289c..fe255f65 100644 --- a/src/CRE/shader.cpp +++ b/src/CRE/shader.cpp @@ -1803,7 +1803,21 @@ static bool shader_update_data(shader_set_data* set, GLenum mode, GLenum type, c depth_stencil_state.depthCompareOp = Vulkan::get_compare_op( gl_state.depth_test ? gl_state.depth_func : GL_ALWAYS); depth_stencil_state.depthBoundsTestEnable = VK_FALSE; - depth_stencil_state.stencilTestEnable = VK_FALSE; + depth_stencil_state.stencilTestEnable = gl_state.stencil_test ? VK_TRUE : VK_FALSE; + depth_stencil_state.front.failOp = Vulkan::get_stencil_op(gl_state.stencil_fail); + depth_stencil_state.front.passOp = Vulkan::get_stencil_op(gl_state.stencil_dppass); + depth_stencil_state.front.depthFailOp = Vulkan::get_stencil_op(gl_state.stencil_dpfail); + depth_stencil_state.front.compareOp = Vulkan::get_compare_op(gl_state.stencil_func); + depth_stencil_state.front.compareMask = gl_state.stencil_value_mask; + depth_stencil_state.front.writeMask = gl_state.stencil_mask; + depth_stencil_state.front.reference = gl_state.stencil_ref; + depth_stencil_state.back.failOp = Vulkan::get_stencil_op(gl_state.stencil_fail); + depth_stencil_state.back.passOp = Vulkan::get_stencil_op(gl_state.stencil_dppass); + depth_stencil_state.back.depthFailOp = Vulkan::get_stencil_op(gl_state.stencil_dpfail); + depth_stencil_state.back.compareOp = Vulkan::get_compare_op(gl_state.stencil_func); + depth_stencil_state.back.compareMask = gl_state.stencil_value_mask; + depth_stencil_state.back.writeMask = gl_state.stencil_mask; + depth_stencil_state.back.reference = gl_state.stencil_ref; depth_stencil_state.minDepthBounds = 0.0f; depth_stencil_state.maxDepthBounds = 1.0f; @@ -1833,7 +1847,8 @@ static bool shader_update_data(shader_set_data* set, GLenum mode, GLenum type, c VkPipelineLayout pipeline_layout = vk_descriptor_pipeline->GetPipelineLayout(); extern VkRenderPassBeginInfo vulkan_swapchain_render_pass_info; - const uint32_t framebuffer_index = depth_stencil_state.depthWriteEnable ? 0 : 1; + const uint32_t framebuffer_index = depth_stencil_state.depthWriteEnable + || depth_stencil_state.stencilTestEnable ? 0 : 1; VkRenderPass render_pass; if (gl_state.draw_framebuffer_binding) { Vulkan::gl_framebuffer* vk_fbo = Vulkan::gl_framebuffer::get(gl_state.draw_framebuffer_binding); @@ -2317,6 +2332,7 @@ static bool shader_update_data(shader_set_data* set, GLenum mode, GLenum type, c if (vk_fbo->depth_attachment) { Vulkan::gl_texture* vk_tex = Vulkan::gl_texture::get(vk_fbo->depth_attachment); const VkImageLayout layout = depth_stencil_state.depthWriteEnable + || depth_stencil_state.stencilTestEnable ? VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL; Vulkan::Image::PipelineBarrier(Vulkan::current_command_buffer, diff --git a/src/CRE/shader_ft.cpp b/src/CRE/shader_ft.cpp index 761a0112..0551de04 100644 --- a/src/CRE/shader_ft.cpp +++ b/src/CRE/shader_ft.cpp @@ -92,6 +92,7 @@ enum shader_ft_sub_enum { SHADER_FT_SUB_DOF_MAIN_FILTER, SHADER_FT_SUB_DOF_UPSAMPLE, SHADER_FT_SUB_TRANSPARENCY, + SHADER_FT_SUB_REFLECT_STENCIL, SHADER_FT_SUB_SHADER_END, }; @@ -703,6 +704,14 @@ static const int32_t transparency_fpt_unival_max[] = { -1, }; +static const int32_t reflect_stencil_vpt_unival_max[] = { + -1, +}; + +static const int32_t reflect_stencil_fpt_unival_max[] = { + -1, +}; + #pragma region Shader Description #define SHADER_DESCRIPTION_EFFECT_TEXTURE_SAMPLER \ { SHADER_DESCRIPTION_SAMPLER, 14, 0, U_INVALID, } @@ -2006,6 +2015,17 @@ static const shader_description transparency_fpt_desc[] = { { SHADER_DESCRIPTION_FRAGMENT_OUTPUT, 0, 4, U_INVALID, }, { SHADER_DESCRIPTION_END, -1, -1, U_INVALID, }, }; + +static const shader_description reflect_stencil_vpt_desc[] = { + SHADER_DESCRIPTION_COMMON_QUAD, + { SHADER_DESCRIPTION_END, -1, -1, U_INVALID, }, +}; + +static const shader_description reflect_stencil_fpt_desc[] = { + { SHADER_DESCRIPTION_SAMPLER, 0, 0, U_INVALID, }, + { SHADER_DESCRIPTION_FRAGMENT_OUTPUT, 0, 4, U_INVALID, }, + { SHADER_DESCRIPTION_END, -1, -1, U_INVALID, }, +}; #undef SHADER_DESCRIPTION_COMMON_QUAD #undef SHADER_DESCRIPTION_COMMON_SKINNING #undef SHADER_DESCRIPTION_COMMON_SCENE @@ -2254,6 +2274,10 @@ static const shader_sub_table TRANSPARENCY_table[] = { shader_sub_table_struct(TRANSPARENCY, transparency, transparency), }; +static const shader_sub_table REFLECT_STENCIL_table[] = { + shader_sub_table_struct(REFLECT_STENCIL, reflect_stencil, reflect_stencil), +}; + #undef shader_sub_table_struct static const uniform_name BLINN_uniform[] = { @@ -2474,6 +2498,10 @@ static const uniform_name TRANSPARENCY_uniform[] = { U_INVALID, }; +static const uniform_name REFLECT_STENCIL_uniform[] = { + U_INVALID, +}; + struct glass_eye_struct { const vec4 tex_model_param; const vec4 eb_tex_model_param; @@ -2564,6 +2592,7 @@ const shader_table shader_ft_table[] = { shader_table_struct(SPRITE), shader_table_struct(DOF), shader_table_struct(TRANSPARENCY), + shader_table_struct(REFLECT_STENCIL), }; #undef shader_table_struct diff --git a/src/CRE/shader_ft.hpp b/src/CRE/shader_ft.hpp index fd6881a9..4270d264 100644 --- a/src/CRE/shader_ft.hpp +++ b/src/CRE/shader_ft.hpp @@ -58,6 +58,7 @@ enum shader_ft_enum { SHADER_FT_SPRITE, SHADER_FT_DOF, SHADER_FT_TRANSPARENCY, + SHADER_FT_REFLECT_STENCIL, SHADER_FT_END, SHADER_FT_MAX, };