From 94c7dd996bfb9123425c87f2d149018d371dded7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Wed, 27 Apr 2016 17:57:45 +0200 Subject: [PATCH] Update BGFX and BX (nw) --- 3rdparty/bgfx/3rdparty/.editorconfig | 4 + 3rdparty/bgfx/3rdparty/fcpp/cpp6.c | 2 +- .../src/glsl/ir_print_glsl_visitor.cpp | 13 +- .../bgfx/3rdparty/iqa/include/math_utils.h | 10 +- .../3rdparty/khronos/vulkan/vk_platform.h | 8 +- .../bgfx/3rdparty/khronos/vulkan/vulkan.h | 75 +- .../bgfx/3rdparty/ocornut-imgui/imgui.cpp | 194 ++--- 3rdparty/bgfx/3rdparty/ocornut-imgui/imgui.h | 48 +- .../3rdparty/ocornut-imgui/imgui_demo.cpp | 4 +- .../3rdparty/ocornut-imgui/imgui_draw.cpp | 107 ++- .../3rdparty/ocornut-imgui/imgui_internal.h | 14 +- .../bgfx/3rdparty/renderdoc/renderdoc_app.h | 14 + 3rdparty/bgfx/README.md | 12 +- .../examples/00-helloworld/helloworld.cpp | 189 ++++- 3rdparty/bgfx/examples/06-bump/bump.cpp | 4 +- 3rdparty/bgfx/examples/08-update/update.cpp | 18 +- 3rdparty/bgfx/examples/09-hdr/hdr.cpp | 2 +- 3rdparty/bgfx/examples/12-lod/lod.cpp | 4 +- 3rdparty/bgfx/examples/13-stencil/stencil.cpp | 6 +- .../14-shadowvolumes/shadowvolumes.cpp | 6 +- .../examples/16-shadowmaps/shadowmaps.cpp | 6 +- 3rdparty/bgfx/examples/18-ibl/ibl.cpp | 6 +- .../bgfx/examples/21-deferred/deferred.cpp | 4 +- .../23-vectordisplay/vectordisplay.cpp | 58 +- .../examples/23-vectordisplay/vectordisplay.h | 34 +- 3rdparty/bgfx/examples/common/bgfx_utils.cpp | 24 +- 3rdparty/bgfx/examples/common/entry/entry.cpp | 4 +- .../bgfx/examples/common/entry/entry_sdl.cpp | 56 +- .../entry/{entry_winrt.cpp => entry_winrt.cx} | 14 +- 3rdparty/bgfx/examples/common/entry/input.cpp | 16 +- 3rdparty/bgfx/examples/common/imgui/imgui.h | 5 + 3rdparty/bgfx/include/bgfx/bgfxdefines.h | 3 +- 3rdparty/bgfx/include/bgfx/c99/bgfx.h | 9 +- 3rdparty/bgfx/makefile | 12 +- 3rdparty/bgfx/scripts/example-common.lua | 8 +- 3rdparty/bgfx/scripts/genie.lua | 6 +- 3rdparty/bgfx/scripts/texturev.lua | 233 ++++++ 3rdparty/bgfx/src/amalgamated.cpp | 1 + 3rdparty/bgfx/src/bgfx.cpp | 6 + 3rdparty/bgfx/src/bgfx_p.h | 12 +- 3rdparty/bgfx/src/bgfx_shader.sh | 7 +- 3rdparty/bgfx/src/glimports.h | 2 + 3rdparty/bgfx/src/hmd_openvr.cpp | 16 +- 3rdparty/bgfx/src/hmd_ovr.cpp | 6 +- 3rdparty/bgfx/src/renderer_d3d11.cpp | 34 +- 3rdparty/bgfx/src/renderer_d3d12.cpp | 211 ++++- 3rdparty/bgfx/src/renderer_gl.cpp | 124 ++- 3rdparty/bgfx/src/renderer_gl.h | 16 + 3rdparty/bgfx/src/vertexdecl.cpp | 1 + 3rdparty/bgfx/tools/shaderc/shaderc.cpp | 10 + 3rdparty/bgfx/tools/texturec/texturec.cpp | 51 +- 3rdparty/bgfx/tools/texturev/fs_texture.bin.h | 127 ++++ 3rdparty/bgfx/tools/texturev/fs_texture.sc | 19 + .../bgfx/tools/texturev/fs_texture_cube.bin.h | 187 +++++ .../bgfx/tools/texturev/fs_texture_cube.sc | 21 + 3rdparty/bgfx/tools/texturev/makefile | 6 + 3rdparty/bgfx/tools/texturev/texturev.cpp | 718 ++++++++++++++++++ 3rdparty/bgfx/tools/texturev/varying.def.sc | 8 + 3rdparty/bgfx/tools/texturev/vs_texture.bin.h | 144 ++++ 3rdparty/bgfx/tools/texturev/vs_texture.sc | 16 + .../bgfx/tools/texturev/vs_texture_cube.bin.h | 148 ++++ .../bgfx/tools/texturev/vs_texture_cube.sc | 16 + 3rdparty/bx/README.md | 2 + 3rdparty/bx/include/bx/debug.h | 4 +- 3rdparty/bx/include/bx/os.h | 60 ++ 3rdparty/bx/include/bx/thread.h | 4 +- 3rdparty/bx/include/compat/mingw/dirent.h | 5 + 3rdparty/bx/include/compat/mingw/dxsdk.patch | 135 ---- 3rdparty/bx/include/compat/msvc/dirent.h | 64 +- 3rdparty/bx/scripts/toolchain.lua | 10 +- 3rdparty/bx/tools/bin/darwin/genie | Bin 438560 -> 442656 bytes 3rdparty/bx/tools/bin/linux/genie | Bin 413240 -> 417336 bytes 3rdparty/bx/tools/bin/windows/genie.exe | Bin 416256 -> 419840 bytes 73 files changed, 2849 insertions(+), 574 deletions(-) rename 3rdparty/bgfx/examples/common/entry/{entry_winrt.cpp => entry_winrt.cx} (94%) create mode 100644 3rdparty/bgfx/scripts/texturev.lua create mode 100644 3rdparty/bgfx/tools/texturev/fs_texture.bin.h create mode 100644 3rdparty/bgfx/tools/texturev/fs_texture.sc create mode 100644 3rdparty/bgfx/tools/texturev/fs_texture_cube.bin.h create mode 100644 3rdparty/bgfx/tools/texturev/fs_texture_cube.sc create mode 100644 3rdparty/bgfx/tools/texturev/makefile create mode 100644 3rdparty/bgfx/tools/texturev/texturev.cpp create mode 100644 3rdparty/bgfx/tools/texturev/varying.def.sc create mode 100644 3rdparty/bgfx/tools/texturev/vs_texture.bin.h create mode 100644 3rdparty/bgfx/tools/texturev/vs_texture.sc create mode 100644 3rdparty/bgfx/tools/texturev/vs_texture_cube.bin.h create mode 100644 3rdparty/bgfx/tools/texturev/vs_texture_cube.sc create mode 100644 3rdparty/bx/include/compat/mingw/dirent.h delete mode 100644 3rdparty/bx/include/compat/mingw/dxsdk.patch diff --git a/3rdparty/bgfx/3rdparty/.editorconfig b/3rdparty/bgfx/3rdparty/.editorconfig index 901bf58d065..214695015af 100644 --- a/3rdparty/bgfx/3rdparty/.editorconfig +++ b/3rdparty/bgfx/3rdparty/.editorconfig @@ -8,6 +8,10 @@ indent_size = 4 indent_style = space indent_size = 2 +[iqa/*] +indent_style = tab +indent_size = 4 + [libsquish/*] indent_style = tab indent_size = 4 diff --git a/3rdparty/bgfx/3rdparty/fcpp/cpp6.c b/3rdparty/bgfx/3rdparty/fcpp/cpp6.c index 0419152fbac..30d22697cf5 100644 --- a/3rdparty/bgfx/3rdparty/fcpp/cpp6.c +++ b/3rdparty/bgfx/3rdparty/fcpp/cpp6.c @@ -1084,7 +1084,7 @@ void domsg(struct Global *global, ; tp = file ? file->filename : 0; Error(global, "%s\"%s\", line %d: %s: ", - MSG_PREFIX, tp, global->infile->fp?global->line:file->line, severity); + MSG_PREFIX, tp, global->infile?global->line:(file?file->line:0), severity); if(global->error) global->error(global->userdata, ErrorMessage[error], arg); #if defined(UNIX) diff --git a/3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_print_glsl_visitor.cpp b/3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_print_glsl_visitor.cpp index f11893bbad6..3f85b41c4d1 100644 --- a/3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_print_glsl_visitor.cpp +++ b/3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_print_glsl_visitor.cpp @@ -825,6 +825,7 @@ void ir_print_glsl_visitor::visit(ir_texture *ir) glsl_sampler_dim sampler_dim = (glsl_sampler_dim)ir->sampler->type->sampler_dimensionality; const bool is_shadow = ir->sampler->type->sampler_shadow; const bool is_array = ir->sampler->type->sampler_array; + const bool is_msaa = ir->op == ir_txf_ms; const glsl_type* uv_type = ir->coordinate->type; const int uv_dim = uv_type->vector_elements; int sampler_uv_dim = tex_sampler_dim_size[sampler_dim]; @@ -832,6 +833,8 @@ void ir_print_glsl_visitor::visit(ir_texture *ir) sampler_uv_dim += 1; if (is_array) sampler_uv_dim += 1; + if (is_msaa) + sampler_uv_dim += 1; const bool is_proj = (uv_dim > sampler_uv_dim); const bool is_lod = (ir->op == ir_txl); @@ -876,8 +879,10 @@ void ir_print_glsl_visitor::visit(ir_texture *ir) } else { - if (ir->op == ir_txf) + if (ir->op == ir_txf + || ir->op == ir_txf_ms) { buffer.asprintf_append ("texelFetch"); + } else buffer.asprintf_append ("texture"); } @@ -885,7 +890,7 @@ void ir_print_glsl_visitor::visit(ir_texture *ir) if (is_array && state->EXT_texture_array_enable) buffer.asprintf_append ("Array"); - if (is_proj) + if (ir->op == ir_tex && is_proj) buffer.asprintf_append ("Proj"); if (ir->op == ir_txl) buffer.asprintf_append ("Lod"); @@ -921,12 +926,12 @@ void ir_print_glsl_visitor::visit(ir_texture *ir) ir->coordinate->accept(this); // lod - if (ir->op == ir_txl || ir->op == ir_txf) + if (ir->op == ir_txl || ir->op == ir_txf || ir->op == ir_txf_ms) { buffer.asprintf_append (", "); ir->lod_info.lod->accept(this); } - + // grad if (ir->op == ir_txd) { diff --git a/3rdparty/bgfx/3rdparty/iqa/include/math_utils.h b/3rdparty/bgfx/3rdparty/iqa/include/math_utils.h index 0445caa42ed..674b354d03a 100644 --- a/3rdparty/bgfx/3rdparty/iqa/include/math_utils.h +++ b/3rdparty/bgfx/3rdparty/iqa/include/math_utils.h @@ -40,18 +40,18 @@ /** * Rounds a float to the nearest integer. */ -IQA_EXPORT IQA_INLINE int _round(float a); +IQA_EXPORT int _round(float a); -IQA_EXPORT IQA_INLINE int _max(int x, int y); +IQA_EXPORT int _max(int x, int y); -IQA_EXPORT IQA_INLINE int _min(int x, int y); +IQA_EXPORT int _min(int x, int y); /** * Compares 2 floats to the specified digit of precision. * @return 0 if equal, 1 otherwise. */ -IQA_EXPORT IQA_INLINE int _cmp_float(float a, float b, int digits); +IQA_EXPORT int _cmp_float(float a, float b, int digits); /** @@ -59,6 +59,6 @@ IQA_EXPORT IQA_INLINE int _cmp_float(float a, float b, int digits); * same size as 'a' or smaller. * @return 0 if equal, 1 otherwise */ -IQA_EXPORT IQA_INLINE int _matrix_cmp(const float *a, const float *b, int w, int h, int digits); +IQA_EXPORT int _matrix_cmp(const float *a, const float *b, int w, int h, int digits); #endif /*_MATH_UTILS_H_*/ diff --git a/3rdparty/bgfx/3rdparty/khronos/vulkan/vk_platform.h b/3rdparty/bgfx/3rdparty/khronos/vulkan/vk_platform.h index 075a18cab36..f5a5243b8f2 100644 --- a/3rdparty/bgfx/3rdparty/khronos/vulkan/vk_platform.h +++ b/3rdparty/bgfx/3rdparty/khronos/vulkan/vk_platform.h @@ -2,7 +2,7 @@ // File: vk_platform.h // /* -** Copyright (c) 2014-2016 The Khronos Group Inc. +** Copyright (c) 2014-2015 The Khronos Group Inc. ** ** Permission is hereby granted, free of charge, to any person obtaining a ** copy of this software and/or associated documentation files (the @@ -25,8 +25,8 @@ */ -#ifndef __VK_PLATFORM_H__ -#define __VK_PLATFORM_H__ +#ifndef VK_PLATFORM_H_ +#define VK_PLATFORM_H_ #ifdef __cplusplus extern "C" @@ -124,4 +124,4 @@ extern "C" #include #endif -#endif // __VK_PLATFORM_H__ +#endif diff --git a/3rdparty/bgfx/3rdparty/khronos/vulkan/vulkan.h b/3rdparty/bgfx/3rdparty/khronos/vulkan/vulkan.h index f57c4d93688..dca5e259fda 100644 --- a/3rdparty/bgfx/3rdparty/khronos/vulkan/vulkan.h +++ b/3rdparty/bgfx/3rdparty/khronos/vulkan/vulkan.h @@ -40,12 +40,18 @@ extern "C" { #define VK_MAKE_VERSION(major, minor, patch) \ (((major) << 22) | ((minor) << 12) | (patch)) -// Vulkan API version supported by this file -#define VK_API_VERSION VK_MAKE_VERSION(1, 0, 5) +// DEPRECATED: This define has been removed. Specific version defines (e.g. VK_API_VERSION_1_0), or the VK_MAKE_VERSION macro, should be used instead. +//#define VK_API_VERSION VK_MAKE_VERSION(1, 0, 0) + +// Vulkan 1.0 version number +#define VK_API_VERSION_1_0 VK_MAKE_VERSION(1, 0, 0) #define VK_VERSION_MAJOR(version) ((uint32_t)(version) >> 22) #define VK_VERSION_MINOR(version) (((uint32_t)(version) >> 12) & 0x3ff) #define VK_VERSION_PATCH(version) ((uint32_t)(version) & 0xfff) +// Version of this file +#define VK_HEADER_VERSION 8 + #define VK_NULL_HANDLE 0 @@ -680,6 +686,7 @@ typedef enum VkDynamicState { typedef enum VkFilter { VK_FILTER_NEAREST = 0, VK_FILTER_LINEAR = 1, + VK_FILTER_CUBIC_IMG = 1000015000, VK_FILTER_BEGIN_RANGE = VK_FILTER_NEAREST, VK_FILTER_END_RANGE = VK_FILTER_LINEAR, VK_FILTER_RANGE_SIZE = (VK_FILTER_LINEAR - VK_FILTER_NEAREST + 1), @@ -809,6 +816,8 @@ typedef enum VkFormatFeatureFlagBits { VK_FORMAT_FEATURE_BLIT_SRC_BIT = 0x00000400, VK_FORMAT_FEATURE_BLIT_DST_BIT = 0x00000800, VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT = 0x00001000, + VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG = 0x00002000, + VK_FORMAT_FEATURE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkFormatFeatureFlagBits; typedef VkFlags VkFormatFeatureFlags; @@ -821,6 +830,7 @@ typedef enum VkImageUsageFlagBits { VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT = 0x00000020, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT = 0x00000040, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT = 0x00000080, + VK_IMAGE_USAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkImageUsageFlagBits; typedef VkFlags VkImageUsageFlags; @@ -830,6 +840,7 @@ typedef enum VkImageCreateFlagBits { VK_IMAGE_CREATE_SPARSE_ALIASED_BIT = 0x00000004, VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT = 0x00000008, VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT = 0x00000010, + VK_IMAGE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkImageCreateFlagBits; typedef VkFlags VkImageCreateFlags; @@ -841,6 +852,7 @@ typedef enum VkSampleCountFlagBits { VK_SAMPLE_COUNT_16_BIT = 0x00000010, VK_SAMPLE_COUNT_32_BIT = 0x00000020, VK_SAMPLE_COUNT_64_BIT = 0x00000040, + VK_SAMPLE_COUNT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkSampleCountFlagBits; typedef VkFlags VkSampleCountFlags; @@ -849,6 +861,7 @@ typedef enum VkQueueFlagBits { VK_QUEUE_COMPUTE_BIT = 0x00000002, VK_QUEUE_TRANSFER_BIT = 0x00000004, VK_QUEUE_SPARSE_BINDING_BIT = 0x00000008, + VK_QUEUE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkQueueFlagBits; typedef VkFlags VkQueueFlags; @@ -858,11 +871,13 @@ typedef enum VkMemoryPropertyFlagBits { VK_MEMORY_PROPERTY_HOST_COHERENT_BIT = 0x00000004, VK_MEMORY_PROPERTY_HOST_CACHED_BIT = 0x00000008, VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT = 0x00000010, + VK_MEMORY_PROPERTY_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkMemoryPropertyFlagBits; typedef VkFlags VkMemoryPropertyFlags; typedef enum VkMemoryHeapFlagBits { VK_MEMORY_HEAP_DEVICE_LOCAL_BIT = 0x00000001, + VK_MEMORY_HEAP_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkMemoryHeapFlagBits; typedef VkFlags VkMemoryHeapFlags; typedef VkFlags VkDeviceCreateFlags; @@ -886,6 +901,7 @@ typedef enum VkPipelineStageFlagBits { VK_PIPELINE_STAGE_HOST_BIT = 0x00004000, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT = 0x00008000, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT = 0x00010000, + VK_PIPELINE_STAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkPipelineStageFlagBits; typedef VkFlags VkPipelineStageFlags; typedef VkFlags VkMemoryMapFlags; @@ -895,6 +911,7 @@ typedef enum VkImageAspectFlagBits { VK_IMAGE_ASPECT_DEPTH_BIT = 0x00000002, VK_IMAGE_ASPECT_STENCIL_BIT = 0x00000004, VK_IMAGE_ASPECT_METADATA_BIT = 0x00000008, + VK_IMAGE_ASPECT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkImageAspectFlagBits; typedef VkFlags VkImageAspectFlags; @@ -902,16 +919,19 @@ typedef enum VkSparseImageFormatFlagBits { VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT = 0x00000001, VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT = 0x00000002, VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT = 0x00000004, + VK_SPARSE_IMAGE_FORMAT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkSparseImageFormatFlagBits; typedef VkFlags VkSparseImageFormatFlags; typedef enum VkSparseMemoryBindFlagBits { VK_SPARSE_MEMORY_BIND_METADATA_BIT = 0x00000001, + VK_SPARSE_MEMORY_BIND_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkSparseMemoryBindFlagBits; typedef VkFlags VkSparseMemoryBindFlags; typedef enum VkFenceCreateFlagBits { VK_FENCE_CREATE_SIGNALED_BIT = 0x00000001, + VK_FENCE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkFenceCreateFlagBits; typedef VkFlags VkFenceCreateFlags; typedef VkFlags VkSemaphoreCreateFlags; @@ -930,6 +950,7 @@ typedef enum VkQueryPipelineStatisticFlagBits { VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT = 0x00000100, VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT = 0x00000200, VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT = 0x00000400, + VK_QUERY_PIPELINE_STATISTIC_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkQueryPipelineStatisticFlagBits; typedef VkFlags VkQueryPipelineStatisticFlags; @@ -938,6 +959,7 @@ typedef enum VkQueryResultFlagBits { VK_QUERY_RESULT_WAIT_BIT = 0x00000002, VK_QUERY_RESULT_WITH_AVAILABILITY_BIT = 0x00000004, VK_QUERY_RESULT_PARTIAL_BIT = 0x00000008, + VK_QUERY_RESULT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkQueryResultFlagBits; typedef VkFlags VkQueryResultFlags; @@ -945,6 +967,7 @@ typedef enum VkBufferCreateFlagBits { VK_BUFFER_CREATE_SPARSE_BINDING_BIT = 0x00000001, VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT = 0x00000002, VK_BUFFER_CREATE_SPARSE_ALIASED_BIT = 0x00000004, + VK_BUFFER_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkBufferCreateFlagBits; typedef VkFlags VkBufferCreateFlags; @@ -958,6 +981,7 @@ typedef enum VkBufferUsageFlagBits { VK_BUFFER_USAGE_INDEX_BUFFER_BIT = 0x00000040, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT = 0x00000080, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT = 0x00000100, + VK_BUFFER_USAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkBufferUsageFlagBits; typedef VkFlags VkBufferUsageFlags; typedef VkFlags VkBufferViewCreateFlags; @@ -969,6 +993,7 @@ typedef enum VkPipelineCreateFlagBits { VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT = 0x00000001, VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT = 0x00000002, VK_PIPELINE_CREATE_DERIVATIVE_BIT = 0x00000004, + VK_PIPELINE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkPipelineCreateFlagBits; typedef VkFlags VkPipelineCreateFlags; typedef VkFlags VkPipelineShaderStageCreateFlags; @@ -982,6 +1007,7 @@ typedef enum VkShaderStageFlagBits { VK_SHADER_STAGE_COMPUTE_BIT = 0x00000020, VK_SHADER_STAGE_ALL_GRAPHICS = 0x0000001F, VK_SHADER_STAGE_ALL = 0x7FFFFFFF, + VK_SHADER_STAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkShaderStageFlagBits; typedef VkFlags VkPipelineVertexInputStateCreateFlags; typedef VkFlags VkPipelineInputAssemblyStateCreateFlags; @@ -994,6 +1020,7 @@ typedef enum VkCullModeFlagBits { VK_CULL_MODE_FRONT_BIT = 0x00000001, VK_CULL_MODE_BACK_BIT = 0x00000002, VK_CULL_MODE_FRONT_AND_BACK = 0x00000003, + VK_CULL_MODE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkCullModeFlagBits; typedef VkFlags VkCullModeFlags; typedef VkFlags VkPipelineMultisampleStateCreateFlags; @@ -1005,6 +1032,7 @@ typedef enum VkColorComponentFlagBits { VK_COLOR_COMPONENT_G_BIT = 0x00000002, VK_COLOR_COMPONENT_B_BIT = 0x00000004, VK_COLOR_COMPONENT_A_BIT = 0x00000008, + VK_COLOR_COMPONENT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkColorComponentFlagBits; typedef VkFlags VkColorComponentFlags; typedef VkFlags VkPipelineDynamicStateCreateFlags; @@ -1015,6 +1043,7 @@ typedef VkFlags VkDescriptorSetLayoutCreateFlags; typedef enum VkDescriptorPoolCreateFlagBits { VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT = 0x00000001, + VK_DESCRIPTOR_POOL_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkDescriptorPoolCreateFlagBits; typedef VkFlags VkDescriptorPoolCreateFlags; typedef VkFlags VkDescriptorPoolResetFlags; @@ -1023,6 +1052,7 @@ typedef VkFlags VkRenderPassCreateFlags; typedef enum VkAttachmentDescriptionFlagBits { VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT = 0x00000001, + VK_ATTACHMENT_DESCRIPTION_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkAttachmentDescriptionFlagBits; typedef VkFlags VkAttachmentDescriptionFlags; typedef VkFlags VkSubpassDescriptionFlags; @@ -1045,22 +1075,26 @@ typedef enum VkAccessFlagBits { VK_ACCESS_HOST_WRITE_BIT = 0x00004000, VK_ACCESS_MEMORY_READ_BIT = 0x00008000, VK_ACCESS_MEMORY_WRITE_BIT = 0x00010000, + VK_ACCESS_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkAccessFlagBits; typedef VkFlags VkAccessFlags; typedef enum VkDependencyFlagBits { VK_DEPENDENCY_BY_REGION_BIT = 0x00000001, + VK_DEPENDENCY_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkDependencyFlagBits; typedef VkFlags VkDependencyFlags; typedef enum VkCommandPoolCreateFlagBits { VK_COMMAND_POOL_CREATE_TRANSIENT_BIT = 0x00000001, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT = 0x00000002, + VK_COMMAND_POOL_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkCommandPoolCreateFlagBits; typedef VkFlags VkCommandPoolCreateFlags; typedef enum VkCommandPoolResetFlagBits { VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT = 0x00000001, + VK_COMMAND_POOL_RESET_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkCommandPoolResetFlagBits; typedef VkFlags VkCommandPoolResetFlags; @@ -1068,16 +1102,19 @@ typedef enum VkCommandBufferUsageFlagBits { VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT = 0x00000001, VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT = 0x00000002, VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT = 0x00000004, + VK_COMMAND_BUFFER_USAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkCommandBufferUsageFlagBits; typedef VkFlags VkCommandBufferUsageFlags; typedef enum VkQueryControlFlagBits { VK_QUERY_CONTROL_PRECISE_BIT = 0x00000001, + VK_QUERY_CONTROL_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkQueryControlFlagBits; typedef VkFlags VkQueryControlFlags; typedef enum VkCommandBufferResetFlagBits { VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT = 0x00000001, + VK_COMMAND_BUFFER_RESET_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkCommandBufferResetFlagBits; typedef VkFlags VkCommandBufferResetFlags; @@ -1085,6 +1122,7 @@ typedef enum VkStencilFaceFlagBits { VK_STENCIL_FACE_FRONT_BIT = 0x00000001, VK_STENCIL_FACE_BACK_BIT = 0x00000002, VK_STENCIL_FRONT_AND_BACK = 0x00000003, + VK_STENCIL_FACE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkStencilFaceFlagBits; typedef VkFlags VkStencilFaceFlags; @@ -3141,10 +3179,10 @@ VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSurfaceKHR) typedef enum VkColorSpaceKHR { VK_COLORSPACE_SRGB_NONLINEAR_KHR = 0, - VK_COLORSPACE_BEGIN_RANGE = VK_COLORSPACE_SRGB_NONLINEAR_KHR, - VK_COLORSPACE_END_RANGE = VK_COLORSPACE_SRGB_NONLINEAR_KHR, - VK_COLORSPACE_RANGE_SIZE = (VK_COLORSPACE_SRGB_NONLINEAR_KHR - VK_COLORSPACE_SRGB_NONLINEAR_KHR + 1), - VK_COLORSPACE_MAX_ENUM = 0x7FFFFFFF + VK_COLOR_SPACE_BEGIN_RANGE_KHR = VK_COLORSPACE_SRGB_NONLINEAR_KHR, + VK_COLOR_SPACE_END_RANGE_KHR = VK_COLORSPACE_SRGB_NONLINEAR_KHR, + VK_COLOR_SPACE_RANGE_SIZE_KHR = (VK_COLORSPACE_SRGB_NONLINEAR_KHR - VK_COLORSPACE_SRGB_NONLINEAR_KHR + 1), + VK_COLOR_SPACE_MAX_ENUM_KHR = 0x7FFFFFFF } VkColorSpaceKHR; typedef enum VkPresentModeKHR { @@ -3152,10 +3190,10 @@ typedef enum VkPresentModeKHR { VK_PRESENT_MODE_MAILBOX_KHR = 1, VK_PRESENT_MODE_FIFO_KHR = 2, VK_PRESENT_MODE_FIFO_RELAXED_KHR = 3, - VK_PRESENT_MODE_BEGIN_RANGE = VK_PRESENT_MODE_IMMEDIATE_KHR, - VK_PRESENT_MODE_END_RANGE = VK_PRESENT_MODE_FIFO_RELAXED_KHR, - VK_PRESENT_MODE_RANGE_SIZE = (VK_PRESENT_MODE_FIFO_RELAXED_KHR - VK_PRESENT_MODE_IMMEDIATE_KHR + 1), - VK_PRESENT_MODE_MAX_ENUM = 0x7FFFFFFF + VK_PRESENT_MODE_BEGIN_RANGE_KHR = VK_PRESENT_MODE_IMMEDIATE_KHR, + VK_PRESENT_MODE_END_RANGE_KHR = VK_PRESENT_MODE_FIFO_RELAXED_KHR, + VK_PRESENT_MODE_RANGE_SIZE_KHR = (VK_PRESENT_MODE_FIFO_RELAXED_KHR - VK_PRESENT_MODE_IMMEDIATE_KHR + 1), + VK_PRESENT_MODE_MAX_ENUM_KHR = 0x7FFFFFFF } VkPresentModeKHR; @@ -3169,6 +3207,7 @@ typedef enum VkSurfaceTransformFlagBitsKHR { VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_180_BIT_KHR = 0x00000040, VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_270_BIT_KHR = 0x00000080, VK_SURFACE_TRANSFORM_INHERIT_BIT_KHR = 0x00000100, + VK_SURFACE_TRANSFORM_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF } VkSurfaceTransformFlagBitsKHR; typedef VkFlags VkSurfaceTransformFlagsKHR; @@ -3177,6 +3216,7 @@ typedef enum VkCompositeAlphaFlagBitsKHR { VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR = 0x00000002, VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR = 0x00000004, VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR = 0x00000008, + VK_COMPOSITE_ALPHA_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF } VkCompositeAlphaFlagBitsKHR; typedef VkFlags VkCompositeAlphaFlagsKHR; @@ -3326,6 +3366,7 @@ typedef enum VkDisplayPlaneAlphaFlagBitsKHR { VK_DISPLAY_PLANE_ALPHA_GLOBAL_BIT_KHR = 0x00000002, VK_DISPLAY_PLANE_ALPHA_PER_PIXEL_BIT_KHR = 0x00000004, VK_DISPLAY_PLANE_ALPHA_PER_PIXEL_PREMULTIPLIED_BIT_KHR = 0x00000008, + VK_DISPLAY_PLANE_ALPHA_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF } VkDisplayPlaneAlphaFlagBitsKHR; typedef VkFlags VkDisplayPlaneAlphaFlagsKHR; typedef VkFlags VkDisplayModeCreateFlagsKHR; @@ -3711,11 +3752,19 @@ typedef enum VkDebugReportObjectTypeEXT { VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT = 26, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT = 27, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT = 28, + VK_DEBUG_REPORT_OBJECT_TYPE_BEGIN_RANGE_EXT = VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, + VK_DEBUG_REPORT_OBJECT_TYPE_END_RANGE_EXT = VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT, + VK_DEBUG_REPORT_OBJECT_TYPE_RANGE_SIZE_EXT = (VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT - VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT + 1), + VK_DEBUG_REPORT_OBJECT_TYPE_MAX_ENUM_EXT = 0x7FFFFFFF } VkDebugReportObjectTypeEXT; typedef enum VkDebugReportErrorEXT { VK_DEBUG_REPORT_ERROR_NONE_EXT = 0, VK_DEBUG_REPORT_ERROR_CALLBACK_REF_EXT = 1, + VK_DEBUG_REPORT_ERROR_BEGIN_RANGE_EXT = VK_DEBUG_REPORT_ERROR_NONE_EXT, + VK_DEBUG_REPORT_ERROR_END_RANGE_EXT = VK_DEBUG_REPORT_ERROR_CALLBACK_REF_EXT, + VK_DEBUG_REPORT_ERROR_RANGE_SIZE_EXT = (VK_DEBUG_REPORT_ERROR_CALLBACK_REF_EXT - VK_DEBUG_REPORT_ERROR_NONE_EXT + 1), + VK_DEBUG_REPORT_ERROR_MAX_ENUM_EXT = 0x7FFFFFFF } VkDebugReportErrorEXT; @@ -3725,6 +3774,7 @@ typedef enum VkDebugReportFlagBitsEXT { VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT = 0x00000004, VK_DEBUG_REPORT_ERROR_BIT_EXT = 0x00000008, VK_DEBUG_REPORT_DEBUG_BIT_EXT = 0x00000010, + VK_DEBUG_REPORT_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF } VkDebugReportFlagBitsEXT; typedef VkFlags VkDebugReportFlagsEXT; @@ -3780,6 +3830,11 @@ VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT( #define VK_NV_GLSL_SHADER_EXTENSION_NAME "VK_NV_glsl_shader" +#define VK_IMG_filter_cubic 1 +#define VK_IMG_FILTER_CUBIC_SPEC_VERSION 1 +#define VK_IMG_FILTER_CUBIC_EXTENSION_NAME "VK_IMG_filter_cubic" + + #ifdef __cplusplus } #endif diff --git a/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui.cpp b/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui.cpp index b09e71cba59..91a03843a52 100644 --- a/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui.cpp +++ b/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui.cpp @@ -534,6 +534,7 @@ - style: try to make PushStyleVar() more robust to incorrect parameters (to be more friendly to edit & continues situation). - style/opt: PopStyleVar could be optimized by having GetStyleVar returns the type, using a table mapping stylevar enum to data type. - style: global scale setting. + - style: WindowPadding needs to be EVEN needs the 0.5 multiplier probably have a subtle effect on clip rectangle - text: simple markup language for color change? - font: dynamic font atlas to avoid baking huge ranges into bitmap and make scaling easier. - font: helper to add glyph redirect/replacements (e.g. redirect alternate apostrophe unicode code points to ascii one, etc.) @@ -558,7 +559,8 @@ - remote: make a system like RemoteImGui first-class citizen/project (#75) !- demo: custom render demo pushes a clipping rectangle past parent window bounds. expose ImGui::PushClipRect() from imgui_internal.h? - drawlist: end-user probably can't call Clear() directly because we expect a texture to be pushed in the stack. - - examples: directx9/directx11: save/restore device state more thoroughly. + - examples: directx9: save/restore device state more thoroughly. + - examples: window minimize, maximize (#583) - optimization: use another hash function than crc32, e.g. FNV1a - optimization/render: merge command-lists with same clip-rect into one even if they aren't sequential? (as long as in-between clip rectangle don't overlap)? - optimization: turn some the various stack vectors into statically-sized arrays @@ -633,7 +635,6 @@ static inline bool IsWindowContentHoverable(ImGuiWindow* window); static void ClearSetNextWindowData(); static void CheckStacksSize(ImGuiWindow* window, bool write); static void Scrollbar(ImGuiWindow* window, bool horizontal); -static bool CloseWindowButton(bool* p_opened); static void AddDrawListToRenderList(ImVector& out_render_list, ImDrawList* draw_list); static void AddWindowToRenderList(ImVector& out_render_list, ImGuiWindow* window); @@ -1575,6 +1576,7 @@ ImGuiWindow::ImGuiWindow(const char* name) MoveID = GetID("#MOVE"); Flags = 0; + IndexWithinParent = 0; PosFloat = Pos = ImVec2(0.0f, 0.0f); Size = SizeFull = ImVec2(0.0f, 0.0f); SizeContents = SizeContentsExplicit = ImVec2(0.0f, 0.0f); @@ -2305,7 +2307,7 @@ static int ChildWindowComparer(const void* lhs, const void* rhs) return d; if (int d = (a->Flags & ImGuiWindowFlags_ComboBox) - (b->Flags & ImGuiWindowFlags_ComboBox)) return d; - return 0; + return (a->IndexWithinParent - b->IndexWithinParent); } static void AddWindowToSortedBuffer(ImVector& out_sorted_windows, ImGuiWindow* window) @@ -2339,9 +2341,13 @@ static void AddDrawListToRenderList(ImVector& out_render_list, ImDr return; } + // Draw list sanity check. Detect mismatch between PrimReserve() calls and incrementing _VtxCurrentIdx, _VtxWritePtr etc. + IM_ASSERT(draw_list->_VtxWritePtr == draw_list->VtxBuffer.Data + draw_list->VtxBuffer.Size); + IM_ASSERT(draw_list->_IdxWritePtr == draw_list->IdxBuffer.Data + draw_list->IdxBuffer.Size); + IM_ASSERT((int)draw_list->_VtxCurrentIdx == draw_list->VtxBuffer.Size); + // Check that draw_list doesn't use more vertices than indexable (default ImDrawIdx = 2 bytes = 64K vertices) // If this assert triggers because you are drawing lots of stuff manually, A) workaround by calling BeginChild()/EndChild() to put your draw commands in multiple draw lists, B) #define ImDrawIdx to a 'unsigned int' in imconfig.h and render accordingly. - IM_ASSERT((int)draw_list->_VtxCurrentIdx == draw_list->VtxBuffer.Size); // Sanity check. Bug or mismatch between PrimReserve() calls and incrementing _VtxCurrentIdx, _VtxWritePtr etc. IM_ASSERT((int64_t)draw_list->_VtxCurrentIdx <= ((int64_t)1L << (sizeof(ImDrawIdx)*8))); // Too many vertices in same ImDrawList. See comment above. out_render_list.push_back(draw_list); @@ -2368,13 +2374,14 @@ void ImGui::PushClipRect(const ImVec2& clip_rect_min, const ImVec2& clip_rect_ma ImGuiWindow* window = GetCurrentWindow(); ImRect cr(clip_rect_min, clip_rect_max); - if (intersect_with_existing_clip_rect) - { - // Clip our argument with the current clip rect + if (intersect_with_existing_clip_rect) // Clip our argument with the current clip rect cr.Clip(window->ClipRect); - } cr.Max.x = ImMax(cr.Min.x, cr.Max.x); cr.Max.y = ImMax(cr.Min.y, cr.Max.y); + cr.Min.x = (float)(int)(cr.Min.x + 0.5f); // Round (expecting to round down). Ensure that e.g. (int)(max.x-min.x) in user code produce correct result. + cr.Min.y = (float)(int)(cr.Min.y + 0.5f); + cr.Max.x = (float)(int)(cr.Max.x + 0.5f); + cr.Max.y = (float)(int)(cr.Max.y + 0.5f); IM_ASSERT(cr.Min.x <= cr.Max.x && cr.Min.y <= cr.Max.y); window->ClipRect = cr; @@ -3372,7 +3379,7 @@ bool ImGui::BeginChild(const char* str_id, const ImVec2& size_arg, bool border, ImGuiWindowFlags flags = ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_NoSavedSettings|ImGuiWindowFlags_ChildWindow; const ImVec2 content_avail = ImGui::GetContentRegionAvail(); - ImVec2 size = ImRound(size_arg); + ImVec2 size = ImFloor(size_arg); if (size.x <= 0.0f) { if (size.x == 0.0f) @@ -3696,6 +3703,7 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_ if (first_begin_of_the_frame) { window->Active = true; + window->IndexWithinParent = 0; window->BeginCount = 0; window->DrawList->Clear(); window->ClipRect = ImVec4(-FLT_MAX,-FLT_MAX,+FLT_MAX,+FLT_MAX); @@ -3826,7 +3834,10 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_ // Position child window if (flags & ImGuiWindowFlags_ChildWindow) + { + window->IndexWithinParent = parent_window->DC.ChildWindows.Size; parent_window->DC.ChildWindows.push_back(window); + } if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_Popup)) { window->Pos = window->PosFloat = parent_window->DC.CursorPos; @@ -4007,6 +4018,8 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_ { ImRect menu_bar_rect = window->MenuBarRect(); window->DrawList->AddRectFilled(menu_bar_rect.GetTL(), menu_bar_rect.GetBR(), GetColorU32(ImGuiCol_MenuBarBg), (flags & ImGuiWindowFlags_NoTitleBar) ? window_rounding : 0.0f, 1|2); + if (flags & ImGuiWindowFlags_ShowBorders) + window->DrawList->AddLine(menu_bar_rect.GetBL()-ImVec2(0,0), menu_bar_rect.GetBR()-ImVec2(0,0), GetColorU32(ImGuiCol_Border)); } // Scrollbars @@ -4077,7 +4090,12 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_ if (!(flags & ImGuiWindowFlags_NoTitleBar)) { if (p_opened != NULL) - CloseWindowButton(p_opened); + { + const float pad = 2.0f; + const float rad = (window->TitleBarHeight() - pad*2.0f) * 0.5f; + if (CloseButton(window->GetID("#CLOSE"), window->Rect().GetTR() + ImVec2(-pad - rad, pad + rad), rad)) + *p_opened = false; + } const ImVec2 text_size = CalcTextSize(name, NULL, true); if (!(flags & ImGuiWindowFlags_NoCollapse)) @@ -4114,9 +4132,9 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_ const ImRect title_bar_rect = window->TitleBarRect(); const float border_size = window->BorderSize; ImRect clip_rect; - clip_rect.Min.x = title_bar_rect.Min.x + 0.5f + ImMax(border_size, window->WindowPadding.x*0.5f); - clip_rect.Min.y = title_bar_rect.Max.y + window->MenuBarHeight() + 0.5f + border_size; - clip_rect.Max.x = window->Pos.x + window->Size.x - window->ScrollbarSizes.x - ImMax(border_size, window->WindowPadding.x*0.5f); + clip_rect.Min.x = title_bar_rect.Min.x + ImMax(border_size, (float)(int)(window->WindowPadding.x*0.5f)); + clip_rect.Min.y = title_bar_rect.Max.y + window->MenuBarHeight() + border_size; + clip_rect.Max.x = window->Pos.x + window->Size.x - window->ScrollbarSizes.x - ImMax(border_size, (float)(int)(window->WindowPadding.x*0.5f)); clip_rect.Max.y = window->Pos.y + window->Size.y - border_size - window->ScrollbarSizes.y; PushClipRect(clip_rect.Min, clip_rect.Max, true); @@ -4189,14 +4207,14 @@ static void Scrollbar(ImGuiWindow* window, bool horizontal) ? ImRect(window->Pos.x + border_size, window_rect.Max.y - style.ScrollbarSize, window_rect.Max.x - other_scrollbar_size_w - border_size, window_rect.Max.y - border_size) : ImRect(window_rect.Max.x - style.ScrollbarSize, window->Pos.y + border_size, window_rect.Max.x - border_size, window_rect.Max.y - other_scrollbar_size_w - border_size); if (!horizontal) - bb.Min.y += window->TitleBarHeight() + ((window->Flags & ImGuiWindowFlags_MenuBar) ? window->MenuBarHeight() - border_size : 0.0f); + bb.Min.y += window->TitleBarHeight() + ((window->Flags & ImGuiWindowFlags_MenuBar) ? window->MenuBarHeight() : 0.0f); float window_rounding = (window->Flags & ImGuiWindowFlags_ChildWindow) ? style.ChildWindowRounding : style.WindowRounding; int window_rounding_corners; if (horizontal) window_rounding_corners = 8 | (other_scrollbar ? 0 : 4); else - window_rounding_corners = ((window->Flags & ImGuiWindowFlags_NoTitleBar) ? 2 : 0) | (other_scrollbar ? 0 : 4); + window_rounding_corners = (((window->Flags & ImGuiWindowFlags_NoTitleBar) && !(window->Flags & ImGuiWindowFlags_MenuBar)) ? 2 : 0) | (other_scrollbar ? 0 : 4); window->DrawList->AddRectFilled(bb.Min, bb.Max, ImGui::GetColorU32(ImGuiCol_ScrollbarBg), window_rounding, window_rounding_corners); bb.Reduce(ImVec2(ImClamp((float)(int)((bb.Max.x - bb.Min.x - 2.0f) * 0.5f), 0.0f, 3.0f), ImClamp((float)(int)((bb.Max.y - bb.Min.y - 2.0f) * 0.5f), 0.0f, 3.0f))); @@ -5385,13 +5403,11 @@ bool ImGui::InvisibleButton(const char* str_id, const ImVec2& size_arg) } // Upper-right button to close a window. -static bool CloseWindowButton(bool* p_opened) +bool ImGui::CloseButton(ImGuiID id, const ImVec2& pos, float radius) { ImGuiWindow* window = ImGui::GetCurrentWindow(); - const ImGuiID id = window->GetID("#CLOSE"); - const float size = window->TitleBarHeight() - 4.0f; - const ImRect bb(window->Rect().GetTR() + ImVec2(-2.0f-size,2.0f), window->Rect().GetTR() + ImVec2(-2.0f,2.0f+size)); + const ImRect bb(pos - ImVec2(radius,radius), pos + ImVec2(radius,radius)); bool hovered, held; bool pressed = ImGui::ButtonBehavior(bb, id, &hovered, &held); @@ -5399,18 +5415,15 @@ static bool CloseWindowButton(bool* p_opened) // Render const ImU32 col = ImGui::GetColorU32((held && hovered) ? ImGuiCol_CloseButtonActive : hovered ? ImGuiCol_CloseButtonHovered : ImGuiCol_CloseButton); const ImVec2 center = bb.GetCenter(); - window->DrawList->AddCircleFilled(center, ImMax(2.0f,size*0.5f), col, 16); + window->DrawList->AddCircleFilled(center, ImMax(2.0f, radius), col, 12); - const float cross_extent = (size * 0.5f * 0.7071f) - 1.0f; + const float cross_extent = (radius * 0.7071f) - 1.0f; if (hovered) { window->DrawList->AddLine(center + ImVec2(+cross_extent,+cross_extent), center + ImVec2(-cross_extent,-cross_extent), ImGui::GetColorU32(ImGuiCol_Text)); window->DrawList->AddLine(center + ImVec2(+cross_extent,-cross_extent), center + ImVec2(-cross_extent,+cross_extent), ImGui::GetColorU32(ImGuiCol_Text)); } - if (p_opened != NULL && pressed) - *p_opened = false; - return pressed; } @@ -5718,65 +5731,6 @@ bool ImGui::CollapsingHeader(const char* label, const char* str_id, bool display return opened; } -void ImGui::Bullet() -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return; - - ImGuiState& g = *GImGui; - const ImGuiStyle& style = g.Style; - const float line_height = ImMax(ImMin(window->DC.CurrentLineHeight, g.FontSize + g.Style.FramePadding.y*2), g.FontSize); - const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(g.FontSize, line_height)); - ItemSize(bb); - if (!ItemAdd(bb, NULL)) - { - ImGui::SameLine(0, style.FramePadding.x*2); - return; - } - - // Render - const float bullet_size = g.FontSize*0.15f; - window->DrawList->AddCircleFilled(bb.Min + ImVec2(style.FramePadding.x + g.FontSize*0.5f, line_height*0.5f), bullet_size, GetColorU32(ImGuiCol_Text)); - - // Stay on same line - ImGui::SameLine(0, style.FramePadding.x*2); -} - -// Text with a little bullet aligned to the typical tree node. -void ImGui::BulletTextV(const char* fmt, va_list args) -{ - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return; - - ImGuiState& g = *GImGui; - const ImGuiStyle& style = g.Style; - - const char* text_begin = g.TempBuffer; - const char* text_end = text_begin + ImFormatStringV(g.TempBuffer, IM_ARRAYSIZE(g.TempBuffer), fmt, args); - const ImVec2 label_size = CalcTextSize(text_begin, text_end, true); - const float text_base_offset_y = ImMax(0.0f, window->DC.CurrentLineTextBaseOffset); // Latch before ItemSize changes it - const float line_height = ImMax(ImMin(window->DC.CurrentLineHeight, g.FontSize + g.Style.FramePadding.y*2), g.FontSize); - const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(g.FontSize + (label_size.x > 0.0f ? (label_size.x + style.FramePadding.x*2) : 0.0f), ImMax(line_height, label_size.y))); // Empty text doesn't add padding - ItemSize(bb); - if (!ItemAdd(bb, NULL)) - return; - - // Render - const float bullet_size = g.FontSize*0.15f; - window->DrawList->AddCircleFilled(bb.Min + ImVec2(style.FramePadding.x + g.FontSize*0.5f, line_height*0.5f), bullet_size, GetColorU32(ImGuiCol_Text)); - RenderText(bb.Min+ImVec2(g.FontSize + style.FramePadding.x*2, text_base_offset_y), text_begin, text_end); -} - -void ImGui::BulletText(const char* fmt, ...) -{ - va_list args; - va_start(args, fmt); - BulletTextV(fmt, args); - va_end(args); -} - // If returning 'true' the node is open and the user is responsible for calling TreePop bool ImGui::TreeNodeV(const char* str_id, const char* fmt, va_list args) { @@ -5898,6 +5852,65 @@ ImGuiID ImGui::GetID(const void* ptr_id) return GImGui->CurrentWindow->GetID(ptr_id); } +void ImGui::Bullet() +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return; + + ImGuiState& g = *GImGui; + const ImGuiStyle& style = g.Style; + const float line_height = ImMax(ImMin(window->DC.CurrentLineHeight, g.FontSize + g.Style.FramePadding.y*2), g.FontSize); + const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(g.FontSize, line_height)); + ItemSize(bb); + if (!ItemAdd(bb, NULL)) + { + ImGui::SameLine(0, style.FramePadding.x*2); + return; + } + + // Render + const float bullet_size = g.FontSize*0.15f; + window->DrawList->AddCircleFilled(bb.Min + ImVec2(style.FramePadding.x + g.FontSize*0.5f, line_height*0.5f), bullet_size, GetColorU32(ImGuiCol_Text)); + + // Stay on same line + ImGui::SameLine(0, style.FramePadding.x*2); +} + +// Text with a little bullet aligned to the typical tree node. +void ImGui::BulletTextV(const char* fmt, va_list args) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return; + + ImGuiState& g = *GImGui; + const ImGuiStyle& style = g.Style; + + const char* text_begin = g.TempBuffer; + const char* text_end = text_begin + ImFormatStringV(g.TempBuffer, IM_ARRAYSIZE(g.TempBuffer), fmt, args); + const ImVec2 label_size = CalcTextSize(text_begin, text_end, true); + const float text_base_offset_y = ImMax(0.0f, window->DC.CurrentLineTextBaseOffset); // Latch before ItemSize changes it + const float line_height = ImMax(ImMin(window->DC.CurrentLineHeight, g.FontSize + g.Style.FramePadding.y*2), g.FontSize); + const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(g.FontSize + (label_size.x > 0.0f ? (label_size.x + style.FramePadding.x*2) : 0.0f), ImMax(line_height, label_size.y))); // Empty text doesn't add padding + ItemSize(bb); + if (!ItemAdd(bb, NULL)) + return; + + // Render + const float bullet_size = g.FontSize*0.15f; + window->DrawList->AddCircleFilled(bb.Min + ImVec2(style.FramePadding.x + g.FontSize*0.5f, line_height*0.5f), bullet_size, GetColorU32(ImGuiCol_Text)); + RenderText(bb.Min+ImVec2(g.FontSize + style.FramePadding.x*2, text_base_offset_y), text_begin, text_end); +} + +void ImGui::BulletText(const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + BulletTextV(fmt, args); + va_end(args); +} + static inline void DataTypeFormatString(ImGuiDataType data_type, void* data_ptr, const char* display_format, char* buf, int buf_size) { if (data_type == ImGuiDataType_Int) @@ -7794,10 +7807,11 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2 draw_window->DrawList->AddText(g.Font, g.FontSize, render_pos - render_scroll, GetColorU32(ImGuiCol_Text), buf, buf+edit_state.CurLenA, 0.0f, is_multiline ? NULL : &clip_rect); // Draw blinking cursor - ImVec2 cursor_screen_pos = render_pos + cursor_offset - render_scroll; bool cursor_is_visible = (g.InputTextState.CursorAnim <= 0.0f) || fmodf(g.InputTextState.CursorAnim, 1.20f) <= 0.80f; - if (cursor_is_visible) - draw_window->DrawList->AddLine(cursor_screen_pos + ImVec2(0.0f,-g.FontSize+0.5f), cursor_screen_pos + ImVec2(0.0f,-1.5f), GetColorU32(ImGuiCol_Text)); + ImVec2 cursor_screen_pos = render_pos + cursor_offset - render_scroll; + ImRect cursor_screen_rect(cursor_screen_pos.x, cursor_screen_pos.y-g.FontSize+0.5f, cursor_screen_pos.x, cursor_screen_pos.y-1.5f); + if (cursor_is_visible && cursor_screen_rect.Overlaps(clip_rect)) + draw_window->DrawList->AddLine(cursor_screen_rect.Min, cursor_screen_rect.Max, GetColorU32(ImGuiCol_Text)); // Notify OS of text input position for advanced IME (-1 x offset so that Windows IME can cover our cursor. Bit of an extra nicety.) if (is_editable) @@ -8423,7 +8437,7 @@ bool ImGui::BeginMenuBar() ImGui::BeginGroup(); // Save position ImGui::PushID("##menubar"); ImRect rect = window->MenuBarRect(); - PushClipRect(ImVec2(rect.Min.x+0.5f, rect.Min.y-0.5f+window->BorderSize), ImVec2(rect.Max.x+0.5f, rect.Max.y-0.5f), false); + PushClipRect(ImVec2(rect.Min.x, rect.Min.y + window->BorderSize), ImVec2(rect.Max.x, rect.Max.y), false); window->DC.CursorPos = ImVec2(rect.Min.x + window->DC.MenuBarOffsetX, rect.Min.y);// + g.Style.FramePadding.y); window->DC.LayoutType = ImGuiLayoutType_Horizontal; window->DC.MenuBarAppending = true; @@ -8802,6 +8816,7 @@ bool ImGui::IsRectVisible(const ImVec2& size) return window->ClipRect.Overlaps(ImRect(window->DC.CursorPos, window->DC.CursorPos + size)); } +// Lock horizontal starting position + capture group bounding box into one "item" (so you can use IsItemHovered() or layout primitives such as SameLine() on whole group, etc.) void ImGui::BeginGroup() { ImGuiWindow* window = GetCurrentWindow(); @@ -9045,7 +9060,6 @@ void ImGui::Columns(int columns_count, const char* id, bool border) { if (g.ActiveIdIsJustActivated) g.ActiveClickDeltaToCenter.x = x - g.IO.MousePos.x; - x = GetDraggedColumnOffset(i); SetColumnOffset(i, x); } @@ -9343,8 +9357,8 @@ void ImGui::ShowMetricsWindow(bool* opened) ImDrawIdx* idx_buffer = (draw_list->IdxBuffer.Size > 0) ? draw_list->IdxBuffer.Data : NULL; for (int i = elem_offset; i < elem_offset + (int)pcmd->ElemCount; i++) vtxs_rect.Add(draw_list->VtxBuffer[idx_buffer ? idx_buffer[i] : i].pos); - clip_rect.Round(); overlay_draw_list->AddRect(clip_rect.Min, clip_rect.Max, ImColor(255,255,0)); - vtxs_rect.Round(); overlay_draw_list->AddRect(vtxs_rect.Min, vtxs_rect.Max, ImColor(255,0,255)); + clip_rect.Floor(); overlay_draw_list->AddRect(clip_rect.Min, clip_rect.Max, ImColor(255,255,0)); + vtxs_rect.Floor(); overlay_draw_list->AddRect(vtxs_rect.Min, vtxs_rect.Max, ImColor(255,0,255)); } if (!draw_opened) continue; diff --git a/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui.h b/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui.h index 0c41e7ae9f8..0ad337d169e 100644 --- a/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui.h +++ b/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui.h @@ -187,14 +187,14 @@ namespace ImGui IMGUI_API void PopButtonRepeat(); // Cursor / Layout - IMGUI_API void BeginGroup(); // lock horizontal starting position. once closing a group it is seen as a single item (so you can use IsItemHovered() on a group, SameLine() between groups, etc. - IMGUI_API void EndGroup(); IMGUI_API void Separator(); // horizontal line IMGUI_API void SameLine(float pos_x = 0.0f, float spacing_w = -1.0f); // call between widgets or groups to layout them horizontally IMGUI_API void Spacing(); // add spacing IMGUI_API void Dummy(const ImVec2& size); // add a dummy item of given size IMGUI_API void Indent(); // move content position toward the right by style.IndentSpacing pixels IMGUI_API void Unindent(); // move content position back to the left (cancel Indent) + IMGUI_API void BeginGroup(); // lock horizontal starting position + capture group bounding box into one "item" (so you can use IsItemHovered() or layout primitives such as SameLine() on whole group, etc.) + IMGUI_API void EndGroup(); IMGUI_API ImVec2 GetCursorPos(); // cursor position is relative to window position IMGUI_API float GetCursorPosX(); // " IMGUI_API float GetCursorPosY(); // " @@ -709,7 +709,7 @@ struct ImGuiIO ImVec2 DisplayVisibleMin; // (0.0f,0.0f) // If you use DisplaySize as a virtual space larger than your screen, set DisplayVisibleMin/Max to the visible area. ImVec2 DisplayVisibleMax; // (0.0f,0.0f) // If the values are the same, we defaults to Min=(0.0f) and Max=DisplaySize - // Advanced/subtle behaviors + // Advanced/subtle behaviors bool WordMovementUsesAltKey; // = defined(__APPLE__) // OS X style: Text editing cursor movement using Alt instead of Ctrl bool ShortcutsUseSuperKey; // = defined(__APPLE__) // OS X style: Shortcuts using Cmd/Super instead of Ctrl bool DoubleClickSelectsWord; // = defined(__APPLE__) // OS X style: Double click selects by word instead of selecting whole text @@ -882,8 +882,8 @@ struct ImGuiTextFilter const char* end() const { return e; } bool empty() const { return b == e; } char front() const { return *b; } - static bool isblank(char c) { return c == ' ' || c == '\t'; } - void trim_blanks() { while (b < e && isblank(*b)) b++; while (e > b && isblank(*(e-1))) e--; } + static bool is_blank(char c) { return c == ' ' || c == '\t'; } + void trim_blanks() { while (b < e && is_blank(*b)) b++; while (e > b && is_blank(*(e-1))) e--; } IMGUI_API void split(char separator, ImVector& out); }; @@ -1142,6 +1142,8 @@ struct ImDrawList IMGUI_API void AddRect(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding = 0.0f, int rounding_corners = 0x0F, float thickness = 1.0f); // a: upper-left, b: lower-right IMGUI_API void AddRectFilled(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding = 0.0f, int rounding_corners = 0x0F); // a: upper-left, b: lower-right IMGUI_API void AddRectFilledMultiColor(const ImVec2& a, const ImVec2& b, ImU32 col_upr_left, ImU32 col_upr_right, ImU32 col_bot_right, ImU32 col_bot_left); + IMGUI_API void AddQuad(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, ImU32 col, float thickness = 1.0f); + IMGUI_API void AddQuadFilled(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, ImU32 col); IMGUI_API void AddTriangle(const ImVec2& a, const ImVec2& b, const ImVec2& c, ImU32 col, float thickness = 1.0f); IMGUI_API void AddTriangleFilled(const ImVec2& a, const ImVec2& b, const ImVec2& c, ImU32 col); IMGUI_API void AddCircle(const ImVec2& centre, float radius, ImU32 col, int num_segments = 12, float thickness = 1.0f); @@ -1183,9 +1185,9 @@ struct ImDrawList IMGUI_API void PrimRect(const ImVec2& a, const ImVec2& b, ImU32 col); // Axis aligned rectangle (composed of two triangles) IMGUI_API void PrimRectUV(const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, ImU32 col); IMGUI_API void PrimQuadUV(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, const ImVec2& uv_a, const ImVec2& uv_b, const ImVec2& uv_c, const ImVec2& uv_d, ImU32 col); - inline void PrimVtx(const ImVec2& pos, const ImVec2& uv, ImU32 col) { PrimWriteIdx((ImDrawIdx)_VtxCurrentIdx); PrimWriteVtx(pos, uv, col); } inline void PrimWriteVtx(const ImVec2& pos, const ImVec2& uv, ImU32 col){ _VtxWritePtr->pos = pos; _VtxWritePtr->uv = uv; _VtxWritePtr->col = col; _VtxWritePtr++; _VtxCurrentIdx++; } inline void PrimWriteIdx(ImDrawIdx idx) { *_IdxWritePtr = idx; _IdxWritePtr++; } + inline void PrimVtx(const ImVec2& pos, const ImVec2& uv, ImU32 col) { PrimWriteIdx((ImDrawIdx)_VtxCurrentIdx); PrimWriteVtx(pos, uv, col); } IMGUI_API void UpdateClipRect(); IMGUI_API void UpdateTextureID(); }; @@ -1287,15 +1289,6 @@ struct ImFontAtlas // ImFontAtlas automatically loads a default embedded font for you when you call GetTexDataAsAlpha8() or GetTexDataAsRGBA32(). struct ImFont { - // Members: Settings - float FontSize; // // Height of characters, set during loading (don't change after loading) - float Scale; // = 1.0f // Base font scale, multiplied by the per-window font scale which you can adjust with SetFontScale() - ImVec2 DisplayOffset; // = (0.0f,1.0f) // Offset font rendering by xx pixels - ImWchar FallbackChar; // = '?' // Replacement glyph if one isn't found. Only set via SetFallbackChar() - ImFontConfig* ConfigData; // // Pointer within ImFontAtlas->ConfigData - int ConfigDataCount; // - - // Members: Runtime data struct Glyph { ImWchar Codepoint; @@ -1303,13 +1296,23 @@ struct ImFont float X0, Y0, X1, Y1; float U0, V0, U1, V1; // Texture coordinates }; - float Ascent, Descent; // Ascent: distance from top to bottom of e.g. 'A' [0..FontSize] - ImFontAtlas* ContainerAtlas; // What we has been loaded into - ImVector Glyphs; + + // Members: Hot ~62/78 bytes + float FontSize; // // Height of characters, set during loading (don't change after loading) + float Scale; // = 1.f // Base font scale, multiplied by the per-window font scale which you can adjust with SetFontScale() + ImVec2 DisplayOffset; // = (0.f,1.f) // Offset font rendering by xx pixels + ImVector Glyphs; // // All glyphs. + ImVector IndexXAdvance; // // Sparse. Glyphs->XAdvance in a directly indexable way (more cache-friendly, for CalcTextSize functions which are often bottleneck in large UI). + ImVector IndexLookup; // // Sparse. Index glyphs by Unicode code-point. const Glyph* FallbackGlyph; // == FindGlyph(FontFallbackChar) - float FallbackXAdvance; // - ImVector IndexXAdvance; // Sparse. Glyphs->XAdvance directly indexable (more cache-friendly that reading from Glyphs, for CalcTextSize functions which are often bottleneck in large UI) - ImVector IndexLookup; // Sparse. Index glyphs by Unicode code-point. + float FallbackXAdvance; // == FallbackGlyph->XAdvance + ImWchar FallbackChar; // = '?' // Replacement glyph if one isn't found. Only set via SetFallbackChar() + + // Members: Cold ~18/26 bytes + short ConfigDataCount; // ~ 1 // Number of ImFontConfig involved in creating this font. Bigger than 1 when merging multiple font sources into one ImFont. + ImFontConfig* ConfigData; // // Pointer within ContainerAtlas->ConfigData + ImFontAtlas* ContainerAtlas; // // What we has been loaded into + float Ascent, Descent; // // Ascent: distance from top to bottom of e.g. 'A' [0..FontSize] // Methods IMGUI_API ImFont(); @@ -1325,7 +1328,8 @@ struct ImFont // 'wrap_width' enable automatic word-wrapping across multiple lines to fit into given width. 0.0f to disable. IMGUI_API ImVec2 CalcTextSizeA(float size, float max_width, float wrap_width, const char* text_begin, const char* text_end = NULL, const char** remaining = NULL) const; // utf8 IMGUI_API const char* CalcWordWrapPositionA(float scale, const char* text, const char* text_end, float wrap_width) const; - IMGUI_API void RenderText(float size, ImVec2 pos, ImU32 col, const ImVec4& clip_rect, const char* text_begin, const char* text_end, ImDrawList* draw_list, float wrap_width = 0.0f, bool cpu_fine_clip = false) const; + IMGUI_API void RenderChar(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col, unsigned short c) const; + IMGUI_API void RenderText(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col, const ImVec4& clip_rect, const char* text_begin, const char* text_end, float wrap_width = 0.0f, bool cpu_fine_clip = false) const; }; //---- Include imgui_user.h at the end of imgui.h diff --git a/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_demo.cpp b/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_demo.cpp index 2bc386b50a7..41dd1564d1a 100644 --- a/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_demo.cpp +++ b/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_demo.cpp @@ -268,7 +268,7 @@ void ImGui::ShowTestWindow(bool* p_opened) if (ImGui::CollapsingHeader("Widgets")) { - if (ImGui::TreeNode("Tree")) + if (ImGui::TreeNode("Trees")) { for (int i = 0; i < 5; i++) { @@ -412,7 +412,7 @@ void ImGui::ShowTestWindow(bool* p_opened) for (int i = 0; i < 16; i++) { ImGui::PushID(i); - if (ImGui::Selectable("Me", &selected[i], 0, ImVec2(50,50))) + if (ImGui::Selectable("Sailor", &selected[i], 0, ImVec2(50,50))) { int x = i % 4, y = i / 4; if (x > 0) selected[i - 1] ^= 1; diff --git a/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_draw.cpp b/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_draw.cpp index 091e2dca085..0a94dbfbaba 100644 --- a/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_draw.cpp +++ b/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_draw.cpp @@ -825,6 +825,30 @@ void ImDrawList::AddRectFilledMultiColor(const ImVec2& a, const ImVec2& c, ImU32 PrimWriteVtx(ImVec2(a.x, c.y), uv, col_bot_left); } +void ImDrawList::AddQuad(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, ImU32 col, float thickness) +{ + if ((col >> 24) == 0) + return; + + PathLineTo(a); + PathLineTo(b); + PathLineTo(c); + PathLineTo(d); + PathStroke(col, true, thickness); +} + +void ImDrawList::AddQuadFilled(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, ImU32 col) +{ + if ((col >> 24) == 0) + return; + + PathLineTo(a); + PathLineTo(b); + PathLineTo(c); + PathLineTo(d); + PathFill(col); +} + void ImDrawList::AddTriangle(const ImVec2& a, const ImVec2& b, const ImVec2& c, ImU32 col, float thickness) { if ((col >> 24) == 0) @@ -896,14 +920,6 @@ void ImDrawList::AddText(const ImFont* font, float font_size, const ImVec2& pos, IM_ASSERT(font->ContainerAtlas->TexID == _TextureIdStack.back()); // Use high-level ImGui::PushFont() or low-level ImDrawList::PushTextureId() to change font. - // reserve vertices for worse case (over-reserving is useful and easily amortized) - const int char_count = (int)(text_end - text_begin); - const int vtx_count_max = char_count * 4; - const int idx_count_max = char_count * 6; - const int vtx_begin = VtxBuffer.Size; - const int idx_begin = IdxBuffer.Size; - PrimReserve(idx_count_max, vtx_count_max); - ImVec4 clip_rect = _ClipRectStack.back(); if (cpu_fine_clip_rect) { @@ -912,18 +928,7 @@ void ImDrawList::AddText(const ImFont* font, float font_size, const ImVec2& pos, clip_rect.z = ImMin(clip_rect.z, cpu_fine_clip_rect->z); clip_rect.w = ImMin(clip_rect.w, cpu_fine_clip_rect->w); } - font->RenderText(font_size, pos, col, clip_rect, text_begin, text_end, this, wrap_width, cpu_fine_clip_rect != NULL); - - // give back unused vertices - // FIXME-OPT: clean this up - VtxBuffer.resize((int)(_VtxWritePtr - VtxBuffer.Data)); - IdxBuffer.resize((int)(_IdxWritePtr - IdxBuffer.Data)); - int vtx_unused = vtx_count_max - (VtxBuffer.Size - vtx_begin); - int idx_unused = idx_count_max - (IdxBuffer.Size - idx_begin); - CmdBuffer.back().ElemCount -= idx_unused; - _VtxWritePtr -= vtx_unused; - _IdxWritePtr -= idx_unused; - _VtxCurrentIdx = (unsigned int)VtxBuffer.Size; + font->RenderText(this, font_size, pos, col, clip_rect, text_begin, text_end, wrap_width, cpu_fine_clip_rect != NULL); } void ImDrawList::AddText(const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end) @@ -1206,7 +1211,7 @@ ImFont* ImFontAtlas::AddFontFromMemoryCompressedTTF(const void* compressed_ttf_d ImFontConfig font_cfg = font_cfg_template ? *font_cfg_template : ImFontConfig(); IM_ASSERT(font_cfg.FontData == NULL); font_cfg.FontDataOwnedByAtlas = true; - return AddFontFromMemoryTTF(buf_decompressed_data, (int)buf_decompressed_size, size_pixels, font_cfg_template, glyph_ranges); + return AddFontFromMemoryTTF(buf_decompressed_data, (int)buf_decompressed_size, size_pixels, &font_cfg, glyph_ranges); } ImFont* ImFontAtlas::AddFontFromMemoryCompressedBase85TTF(const char* compressed_ttf_data_base85, float size_pixels, const ImFontConfig* font_cfg, const ImWchar* glyph_ranges) @@ -1672,6 +1677,7 @@ void ImFont::BuildLookupTable() for (int i = 0; i != Glyphs.Size; i++) max_codepoint = ImMax(max_codepoint, (int)Glyphs[i].Codepoint); + IM_ASSERT(Glyphs.Size < 32*1024); IndexXAdvance.clear(); IndexXAdvance.resize(max_codepoint + 1); IndexLookup.clear(); @@ -1679,13 +1685,13 @@ void ImFont::BuildLookupTable() for (int i = 0; i < max_codepoint + 1; i++) { IndexXAdvance[i] = -1.0f; - IndexLookup[i] = -1; + IndexLookup[i] = (short)-1; } for (int i = 0; i < Glyphs.Size; i++) { int codepoint = (int)Glyphs[i].Codepoint; IndexXAdvance[codepoint] = Glyphs[i].XAdvance; - IndexLookup[codepoint] = i; + IndexLookup[codepoint] = (short)i; } // Create a glyph to handle TAB @@ -1699,7 +1705,7 @@ void ImFont::BuildLookupTable() tab_glyph.Codepoint = '\t'; tab_glyph.XAdvance *= 4; IndexXAdvance[(int)tab_glyph.Codepoint] = (float)tab_glyph.XAdvance; - IndexLookup[(int)tab_glyph.Codepoint] = (int)(Glyphs.Size-1); + IndexLookup[(int)tab_glyph.Codepoint] = (short)(Glyphs.Size-1); } FallbackGlyph = NULL; @@ -1720,9 +1726,9 @@ const ImFont::Glyph* ImFont::FindGlyph(unsigned short c) const { if (c < IndexLookup.Size) { - const int i = IndexLookup[c]; + const short i = IndexLookup[c]; if (i != -1) - return &Glyphs[i]; + return &Glyphs.Data[i]; } return FallbackGlyph; } @@ -1918,7 +1924,23 @@ ImVec2 ImFont::CalcTextSizeA(float size, float max_width, float wrap_width, cons return text_size; } -void ImFont::RenderText(float size, ImVec2 pos, ImU32 col, const ImVec4& clip_rect, const char* text_begin, const char* text_end, ImDrawList* draw_list, float wrap_width, bool cpu_fine_clip) const +void ImFont::RenderChar(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col, unsigned short c) const +{ + if (c == ' ' || c == '\t' || c == '\n' || c == '\r') // Match behavior of RenderText(), those 4 codepoints are hard-coded. + return; + if (const Glyph* glyph = FindGlyph(c)) + { + float scale = (size >= 0.0f) ? (size / FontSize) : 1.0f; + pos.x = (float)(int)pos.x + DisplayOffset.x; + pos.y = (float)(int)pos.y + DisplayOffset.y; + ImVec2 pos_tl(pos.x + glyph->X0 * scale, pos.y + glyph->Y0 * scale); + ImVec2 pos_br(pos.x + glyph->X1 * scale, pos.y + glyph->Y1 * scale); + draw_list->PrimReserve(6, 4); + draw_list->PrimRectUV(pos_tl, pos_br, ImVec2(glyph->U0, glyph->V0), ImVec2(glyph->U1, glyph->V1), col); + } +} + +void ImFont::RenderText(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col, const ImVec4& clip_rect, const char* text_begin, const char* text_end, float wrap_width, bool cpu_fine_clip) const { if (!text_end) text_end = text_begin + strlen(text_begin); @@ -1936,14 +1958,22 @@ void ImFont::RenderText(float size, ImVec2 pos, ImU32 col, const ImVec4& clip_re const bool word_wrap_enabled = (wrap_width > 0.0f); const char* word_wrap_eol = NULL; - ImDrawVert* vtx_write = draw_list->_VtxWritePtr; - ImDrawIdx* idx_write = draw_list->_IdxWritePtr; - unsigned int vtx_current_idx = draw_list->_VtxCurrentIdx; - + // Skip non-visible lines const char* s = text_begin; if (!word_wrap_enabled && y + line_height < clip_rect.y) while (s < text_end && *s != '\n') // Fast-forward to next line s++; + + // Reserve vertices for remaining worse case (over-reserving is useful and easily amortized) + const int vtx_count_max = (int)(text_end - s) * 4; + const int idx_count_max = (int)(text_end - s) * 6; + const int idx_expected_size = draw_list->IdxBuffer.Size + idx_count_max; + draw_list->PrimReserve(idx_count_max, vtx_count_max); + + ImDrawVert* vtx_write = draw_list->_VtxWritePtr; + ImDrawIdx* idx_write = draw_list->_IdxWritePtr; + unsigned int vtx_current_idx = draw_list->_VtxCurrentIdx; + while (s < text_end) { if (word_wrap_enabled) @@ -2012,11 +2042,10 @@ void ImFont::RenderText(float size, ImVec2 pos, ImU32 col, const ImVec4& clip_re if (c != ' ' && c != '\t') { // We don't do a second finer clipping test on the Y axis as we've already skipped anything before clip_rect.y and exit once we pass clip_rect.w - float y1 = (float)(y + glyph->Y0 * scale); - float y2 = (float)(y + glyph->Y1 * scale); - - float x1 = (float)(x + glyph->X0 * scale); - float x2 = (float)(x + glyph->X1 * scale); + float x1 = x + glyph->X0 * scale; + float x2 = x + glyph->X1 * scale; + float y1 = y + glyph->Y0 * scale; + float y2 = y + glyph->Y1 * scale; if (x1 <= clip_rect.z && x2 >= clip_rect.x) { // Render a character @@ -2075,9 +2104,13 @@ void ImFont::RenderText(float size, ImVec2 pos, ImU32 col, const ImVec4& clip_re x += char_width; } + // Give back unused vertices + draw_list->VtxBuffer.resize((int)(vtx_write - draw_list->VtxBuffer.Data)); + draw_list->IdxBuffer.resize((int)(idx_write - draw_list->IdxBuffer.Data)); + draw_list->CmdBuffer[draw_list->CmdBuffer.Size-1].ElemCount -= (idx_expected_size - draw_list->IdxBuffer.Size); draw_list->_VtxWritePtr = vtx_write; - draw_list->_VtxCurrentIdx = vtx_current_idx; draw_list->_IdxWritePtr = idx_write; + draw_list->_VtxCurrentIdx = (unsigned int)draw_list->VtxBuffer.Size; } //----------------------------------------------------------------------------- diff --git a/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_internal.h b/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_internal.h index e886ff1bbb2..8d18d1b5c89 100644 --- a/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_internal.h +++ b/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui_internal.h @@ -135,7 +135,7 @@ static inline ImVec2 ImLerp(const ImVec2& a, const ImVec2& b, const ImVec2& t) static inline float ImLengthSqr(const ImVec2& lhs) { return lhs.x*lhs.x + lhs.y*lhs.y; } static inline float ImLengthSqr(const ImVec4& lhs) { return lhs.x*lhs.x + lhs.y*lhs.y + lhs.z*lhs.z + lhs.w*lhs.w; } static inline float ImInvLength(const ImVec2& lhs, float fail_value) { float d = lhs.x*lhs.x + lhs.y*lhs.y; if (d > 0.0f) return 1.0f / sqrtf(d); return fail_value; } -static inline ImVec2 ImRound(ImVec2 v) { return ImVec2((float)(int)v.x, (float)(int)v.y); } +static inline ImVec2 ImFloor(ImVec2 v) { return ImVec2((float)(int)v.x, (float)(int)v.y); } // We call C++ constructor on own allocated memory via the placement "new(ptr) Type()" syntax. // Defining a custom placement new() with a dummy parameter allows us to bypass including which on some platforms complains when user has disabled exceptions. @@ -231,7 +231,7 @@ struct IMGUI_API ImRect void Expand(const ImVec2& amount) { Min.x -= amount.x; Min.y -= amount.y; Max.x += amount.x; Max.y += amount.y; } void Reduce(const ImVec2& amount) { Min.x += amount.x; Min.y += amount.y; Max.x -= amount.x; Max.y -= amount.y; } void Clip(const ImRect& clip) { if (Min.x < clip.Min.x) Min.x = clip.Min.x; if (Min.y < clip.Min.y) Min.y = clip.Min.y; if (Max.x > clip.Max.x) Max.x = clip.Max.x; if (Max.y > clip.Max.y) Max.y = clip.Max.y; } - void Round() { Min.x = (float)(int)Min.x; Min.y = (float)(int)Min.y; Max.x = (float)(int)Max.x; Max.y = (float)(int)Max.y; } + void Floor() { Min.x = (float)(int)Min.x; Min.y = (float)(int)Min.y; Max.x = (float)(int)Max.x; Max.y = (float)(int)Max.y; } ImVec2 GetClosestPoint(ImVec2 p, bool on_edge) const { if (!on_edge && Contains(p)) @@ -594,8 +594,9 @@ struct IMGUI_API ImGuiDrawContext struct IMGUI_API ImGuiWindow { char* Name; - ImGuiID ID; - ImGuiWindowFlags Flags; + ImGuiID ID; // == ImHash(Name) + ImGuiWindowFlags Flags; // See enum ImGuiWindowFlags_ + int IndexWithinParent; // Order within immediate parent window, if we are a child window. Otherwise 0. ImVec2 PosFloat; ImVec2 Pos; // Position rounded-up to nearest pixel ImVec2 Size; // Current size (==SizeFull or collapsed title bar size) @@ -636,8 +637,8 @@ struct IMGUI_API ImGuiWindow ImGuiStorage StateStorage; float FontWindowScale; // Scale multiplier per-window ImDrawList* DrawList; - ImGuiWindow* RootWindow; - ImGuiWindow* RootNonPopupWindow; + ImGuiWindow* RootWindow; // If we are a child window, this is pointing to the first non-child parent window. Else point to ourself. + ImGuiWindow* RootNonPopupWindow; // If we are a child widnow, this is pointing to the first non-child non-popup parent window. Else point to ourself. // Focus int FocusIdxAllCounter; // Start at -1 and increase as assigned via FocusItemRegister() @@ -715,6 +716,7 @@ namespace ImGui IMGUI_API bool ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags = 0); IMGUI_API bool ButtonEx(const char* label, const ImVec2& size_arg = ImVec2(0,0), ImGuiButtonFlags flags = 0); + IMGUI_API bool CloseButton(ImGuiID id, const ImVec2& pos, float radius); IMGUI_API bool SliderBehavior(const ImRect& frame_bb, ImGuiID id, float* v, float v_min, float v_max, float power, int decimal_precision, ImGuiSliderFlags flags = 0); IMGUI_API bool SliderFloatN(const char* label, float* v, int components, float v_min, float v_max, const char* display_format, float power); diff --git a/3rdparty/bgfx/3rdparty/renderdoc/renderdoc_app.h b/3rdparty/bgfx/3rdparty/renderdoc/renderdoc_app.h index 0e59b4d430a..67c179ad0a9 100644 --- a/3rdparty/bgfx/3rdparty/renderdoc/renderdoc_app.h +++ b/3rdparty/bgfx/3rdparty/renderdoc/renderdoc_app.h @@ -39,7 +39,21 @@ #ifdef __cplusplus extern "C" { #endif + +////////////////////////////////////////////////////////////////////////////////////////////////// +// Constants not used directly in below API + +// This is a GUID/magic value used for when applications pass a path where shader debug +// information can be found to match up with a stripped shader. +// the define can be used like so: const GUID RENDERDOC_ShaderDebugMagicValue = RENDERDOC_ShaderDebugMagicValue_value +#define RENDERDOC_ShaderDebugMagicValue_struct { 0xeab25520, 0x6670, 0x4865, 0x84, 0x29, 0x6c, 0x8, 0x51, 0x54, 0x00, 0xff } + +// as an alternative when you want a byte array (assuming x86 endianness): +#define RENDERDOC_ShaderDebugMagicValue_bytearray { 0x20, 0x55, 0xb2, 0xea, 0x70, 0x66, 0x65, 0x48, 0x84, 0x29, 0x6c, 0x8, 0x51, 0x54, 0x00, 0xff } +// truncated version when only a uint64_t is available (e.g. Vulkan tags): +#define RENDERDOC_ShaderDebugMagicValue_truncated 0x48656670eab25520ULL + ////////////////////////////////////////////////////////////////////////////////////////////////// // RenderDoc capture options // diff --git a/3rdparty/bgfx/README.md b/3rdparty/bgfx/README.md index 9c163f9c644..c074bcc2b68 100644 --- a/3rdparty/bgfx/README.md +++ b/3rdparty/bgfx/README.md @@ -1,10 +1,10 @@ [bgfx](https://github.com/bkaradzic/bgfx) - Cross-platform rendering library ============================================================================ -[![Join the chat at https://gitter.im/bkaradzic/bgfx](https://badges.gitter.im/bkaradzic/bgfx.svg)](https://gitter.im/bkaradzic/bgfx) - [![Build Status](https://travis-ci.org/bkaradzic/bgfx.svg?branch=master)](https://travis-ci.org/bkaradzic/bgfx) [![Build status](https://ci.appveyor.com/api/projects/status/ipa3ojgeaet1oko5?svg=true)](https://ci.appveyor.com/project/bkaradzic/bgfx) +[![License](https://img.shields.io/badge/license-BSD--2%20clause-blue.svg)](https://bkaradzic.github.io/bgfx/license.html) +[![Join the chat at https://gitter.im/bkaradzic/bgfx](https://badges.gitter.im/bkaradzic/bgfx.svg)](https://gitter.im/bkaradzic/bgfx) [What is it?](https://bkaradzic.github.io/bgfx/overview.html) ------------------------------------------------------------- @@ -139,6 +139,14 @@ action puzzle game which isn't afraid of complexity — think Chip's Challenge o crack. ![blackshift-screenshot](https://img.itch.io/aW1hZ2UvNTA3NDkvMjU2OTIzLmpwZw==/original/V%2BbpZD.jpg) +https://eheitzresearch.wordpress.com/415-2/ - Real-Time Polygonal-Light Shading +with Linearly Transformed Cosines, Eric Heitz, Jonathan Dupuy, Stephen Hill and +David Neubelt, ACM SIGGRAPH 2016 + + [License (BSD 2-clause)](https://bkaradzic.github.io/bgfx/license.html) ----------------------------------------------------------------------- diff --git a/3rdparty/bgfx/examples/00-helloworld/helloworld.cpp b/3rdparty/bgfx/examples/00-helloworld/helloworld.cpp index 92996ae0314..e2e8a599a15 100644 --- a/3rdparty/bgfx/examples/00-helloworld/helloworld.cpp +++ b/3rdparty/bgfx/examples/00-helloworld/helloworld.cpp @@ -7,6 +7,7 @@ #include "common.h" #include "bgfx_utils.h" #include "logo.h" +#include "imgui/imgui.h" class ExampleHelloWorld : public entry::AppI { @@ -28,23 +29,111 @@ class ExampleHelloWorld : public entry::AppI // Set view 0 clear state. bgfx::setViewClear(0 , BGFX_CLEAR_COLOR|BGFX_CLEAR_DEPTH - , 0x303030ff + , 0x000000ff , 1.0f , 0 ); + imguiCreate(); + ImGui::GetIO().FontGlobalScale = 1.5; } virtual int shutdown() BX_OVERRIDE { + // Cleanup. + imguiDestroy(); + // Shutdown bgfx. bgfx::shutdown(); return 0; } + void displayMainMenu() + { + if (ImGui::BeginMainMenuBar()) + { + if (ImGui::BeginMenu("Left")) + { + if (ImGui::MenuItem("Brief", "CTRL+1")) {} + if (ImGui::MenuItem("Medium", "CTRL+2")) {} + if (ImGui::MenuItem("Two columns", "CTRL+3")) {} + if (ImGui::MenuItem("Full (name)", "CTRL+4")) {} + if (ImGui::MenuItem("Full (size, time)", "CTRL+5")) {} + if (ImGui::MenuItem("Full (access)", "CTRL+6")) {} + ImGui::Separator(); + if (ImGui::BeginMenu("Sort mode")) + { + ImGui::MenuItem("Name"); + ImGui::MenuItem("Extension"); + ImGui::MenuItem("Modif. Time"); + ImGui::MenuItem("Size"); + ImGui::MenuItem("Unsorted"); + ImGui::EndMenu(); + } + if (ImGui::MenuItem("Change source")) {} + ImGui::EndMenu(); + } + if (ImGui::BeginMenu("Files")) + { + if (ImGui::MenuItem("User menu", "F2")) {} + if (ImGui::MenuItem("View", "F3")) {} + if (ImGui::MenuItem("Edit", "F4")) {} + if (ImGui::MenuItem("Copy", "F5")) {} + if (ImGui::MenuItem("Rename or move", "F6")) {} + if (ImGui::MenuItem("Make directory", "F7")) {} + if (ImGui::MenuItem("Delete", "F8")) {} + ImGui::Separator(); + if (ImGui::MenuItem("File attributes", "CTRL+A")) {} + if (ImGui::MenuItem("Apply command", "CTRL+G")) {} + ImGui::Separator(); + if (ImGui::MenuItem("Select group")) {} + if (ImGui::MenuItem("Unselect group")) {} + if (ImGui::MenuItem("Invert selection")) {} + ImGui::EndMenu(); + } + if (ImGui::BeginMenu("Commands")) + { + if (ImGui::MenuItem("Find file", "ALT+F7")) {} + if (ImGui::MenuItem("History", "ALT+F8")) {} + if (ImGui::MenuItem("Maximize window", "ALT+F9")) {} + ImGui::Separator(); + if (ImGui::MenuItem("Panel on/off", "CTRL+O")) {} + if (ImGui::MenuItem("Equal panels", "CTRL+=")) {} + ImGui::EndMenu(); + } + if (ImGui::BeginMenu("Options")) + { + if (ImGui::MenuItem("Settings")) {} + ImGui::EndMenu(); + } + if (ImGui::BeginMenu("Right")) + { + if (ImGui::MenuItem("Brief", "CTRL+1")) {} + if (ImGui::MenuItem("Medium", "CTRL+2")) {} + if (ImGui::MenuItem("Two columns", "CTRL+3")) {} + if (ImGui::MenuItem("Full (name)", "CTRL+4")) {} + if (ImGui::MenuItem("Full (size, time)", "CTRL+5")) {} + if (ImGui::MenuItem("Full (access)", "CTRL+6")) {} + ImGui::Separator(); + if (ImGui::BeginMenu("Sort mode")) + { + ImGui::MenuItem("Name"); + ImGui::MenuItem("Extension"); + ImGui::MenuItem("Modif. Time"); + ImGui::MenuItem("Size"); + ImGui::MenuItem("Unsorted"); + ImGui::EndMenu(); + } + if (ImGui::MenuItem("Change source")) {} + ImGui::EndMenu(); + } + ImGui::EndMainMenuBar(); + } + } + bool update() BX_OVERRIDE { - if (!entry::processEvents(m_width, m_height, m_debug, m_reset) ) + if (!entry::processEvents(m_width, m_height, m_debug, m_reset, &m_mouseState) ) { // Set view 0 default viewport. bgfx::setViewRect(0, 0, 0, m_width, m_height); @@ -53,18 +142,91 @@ class ExampleHelloWorld : public entry::AppI // if no other draw calls are submitted to view 0. bgfx::touch(0); - // Use debug font to print information about this example. - bgfx::dbgTextClear(); - bgfx::dbgTextImage(bx::uint16_max(m_width /2/8, 20)-20 - , bx::uint16_max(m_height/2/16, 6)-6 - , 40 - , 12 - , s_logo - , 160 - ); - bgfx::dbgTextPrintf(0, 1, 0x4f, "bgfx/examples/00-helloworld"); - bgfx::dbgTextPrintf(0, 2, 0x6f, "Description: Initialization and debug text."); + imguiBeginFrame(m_mouseState.m_mx + , m_mouseState.m_my + , (m_mouseState.m_buttons[entry::MouseButton::Left] ? IMGUI_MBUT_LEFT : 0) + | (m_mouseState.m_buttons[entry::MouseButton::Right] ? IMGUI_MBUT_RIGHT : 0) + , m_mouseState.m_mz + , m_width + , m_height + ); + displayMainMenu(); + ImGui::SetNextWindowPos(ImVec2(0, 32)); + ImGui::SetNextWindowSize(ImVec2(m_width/2, m_height - 32)); + if (ImGui::Begin("Window1", nullptr, ImVec2(m_width/2, m_height-32), 1.0f, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoScrollbar)) + { + ImGui::PushStyleVar(ImGuiStyleVar_ChildWindowRounding, 5.0f); + ImGui::BeginChild("Sub1", ImVec2(0, m_height - 48), true); + + ImGui::Columns(4, "mycolumns"); + ImGui::Separator(); + ImGui::Text("ID"); ImGui::NextColumn(); + ImGui::Text("Name"); ImGui::NextColumn(); + ImGui::Text("Path"); ImGui::NextColumn(); + ImGui::Text("Flags"); ImGui::NextColumn(); + ImGui::Separator(); + const char* names[3] = { "One", "Two", "Three" }; + const char* paths[3] = { "/path/one", "/path/two", "/path/three" }; + static int selected = -1; + for (int i = 0; i < 50; i++) + { + char label[32]; + sprintf(label, "%04d", i); + if (ImGui::Selectable(label, selected == i, ImGuiSelectableFlags_SpanAllColumns)) + selected = i; + ImGui::NextColumn(); + ImGui::Text(names[i%3]); ImGui::NextColumn(); + ImGui::Text(paths[i % 3]); ImGui::NextColumn(); + ImGui::Text("...."); ImGui::NextColumn(); + } + ImGui::Columns(1); + ImGui::Separator(); + + + + ImGui::EndChild(); + ImGui::PopStyleVar(); + } + ImGui::End(); + ImGui::SameLine(); + ImGui::SetNextWindowPos(ImVec2(m_width / 2, 32)); + ImGui::SetNextWindowSize(ImVec2(m_width / 2, m_height - 32)); + if (ImGui::Begin("Window2", nullptr, ImVec2(m_width/2, m_height - 32), 1.0f, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoScrollbar)) + { + ImGui::PushStyleVar(ImGuiStyleVar_ChildWindowRounding, 5.0f); + ImGui::BeginChild("Sub2", ImVec2(0, m_height - 48), true); + + ImGui::Columns(4, "mycolumns"); + ImGui::Separator(); + ImGui::Text("ID"); ImGui::NextColumn(); + ImGui::Text("Name"); ImGui::NextColumn(); + ImGui::Text("Path"); ImGui::NextColumn(); + ImGui::Text("Flags"); ImGui::NextColumn(); + ImGui::Separator(); + const char* names[3] = { "One", "Two", "Three" }; + const char* paths[3] = { "/path/one", "/path/two", "/path/three" }; + static int selected = -1; + for (int i = 0; i < 3; i++) + { + char label[32]; + sprintf(label, "%04d", i); + if (ImGui::Selectable(label, selected == i, ImGuiSelectableFlags_SpanAllColumns)) + selected = i; + ImGui::NextColumn(); + ImGui::Text(names[i]); ImGui::NextColumn(); + ImGui::Text(paths[i]); ImGui::NextColumn(); + ImGui::Text("...."); ImGui::NextColumn(); + } + ImGui::Columns(1); + ImGui::Separator(); + + + ImGui::EndChild(); + ImGui::PopStyleVar(); + } + ImGui::End(); + imguiEndFrame(); // Advance to next frame. Rendering thread will be kicked to // process submitted rendering primitives. bgfx::frame(); @@ -79,6 +241,7 @@ class ExampleHelloWorld : public entry::AppI uint32_t m_height; uint32_t m_debug; uint32_t m_reset; + entry::MouseState m_mouseState; }; ENTRY_IMPLEMENT_MAIN(ExampleHelloWorld); diff --git a/3rdparty/bgfx/examples/06-bump/bump.cpp b/3rdparty/bgfx/examples/06-bump/bump.cpp index 71e06c8d99a..15952012b01 100644 --- a/3rdparty/bgfx/examples/06-bump/bump.cpp +++ b/3rdparty/bgfx/examples/06-bump/bump.cpp @@ -163,10 +163,10 @@ class ExampleBump : public entry::AppI m_program = loadProgram(m_instancingSupported ? "vs_bump_instanced" : "vs_bump", "fs_bump"); // Load diffuse texture. - m_textureColor = loadTexture("fieldstone-rgba.dds"); + m_textureColor = loadTexture("textures/fieldstone-rgba.dds"); // Load normal texture. - m_textureNormal = loadTexture("fieldstone-n.dds"); + m_textureNormal = loadTexture("textures/fieldstone-n.dds"); m_timeOffset = bx::getHPCounter(); } diff --git a/3rdparty/bgfx/examples/08-update/update.cpp b/3rdparty/bgfx/examples/08-update/update.cpp index baa54c17e20..17ce20a44a1 100644 --- a/3rdparty/bgfx/examples/08-update/update.cpp +++ b/3rdparty/bgfx/examples/08-update/update.cpp @@ -149,15 +149,15 @@ public: // Create vertex stream declaration. PosTexcoordVertex::init(); - m_textures[0] = loadTexture("texture_compression_bc1.dds", BGFX_TEXTURE_U_CLAMP|BGFX_TEXTURE_V_CLAMP); - m_textures[1] = loadTexture("texture_compression_bc2.dds", BGFX_TEXTURE_U_CLAMP); - m_textures[2] = loadTexture("texture_compression_bc3.dds", BGFX_TEXTURE_V_CLAMP); - m_textures[3] = loadTexture("texture_compression_etc1.ktx", BGFX_TEXTURE_U_BORDER|BGFX_TEXTURE_V_BORDER|BGFX_TEXTURE_BORDER_COLOR(1) ); - m_textures[4] = loadTexture("texture_compression_etc2.ktx"); - m_textures[5] = loadTexture("texture_compression_ptc12.pvr"); - m_textures[6] = loadTexture("texture_compression_ptc14.pvr"); - m_textures[7] = loadTexture("texture_compression_ptc22.pvr"); - m_textures[8] = loadTexture("texture_compression_ptc24.pvr"); + m_textures[0] = loadTexture("textures/texture_compression_bc1.dds", BGFX_TEXTURE_U_CLAMP|BGFX_TEXTURE_V_CLAMP); + m_textures[1] = loadTexture("textures/texture_compression_bc2.dds", BGFX_TEXTURE_U_CLAMP); + m_textures[2] = loadTexture("textures/texture_compression_bc3.dds", BGFX_TEXTURE_V_CLAMP); + m_textures[3] = loadTexture("textures/texture_compression_etc1.ktx", BGFX_TEXTURE_U_BORDER|BGFX_TEXTURE_V_BORDER|BGFX_TEXTURE_BORDER_COLOR(1) ); + m_textures[4] = loadTexture("textures/texture_compression_etc2.ktx"); + m_textures[5] = loadTexture("textures/texture_compression_ptc12.pvr"); + m_textures[6] = loadTexture("textures/texture_compression_ptc14.pvr"); + m_textures[7] = loadTexture("textures/texture_compression_ptc22.pvr"); + m_textures[8] = loadTexture("textures/texture_compression_ptc24.pvr"); const bgfx::Caps* caps = bgfx::getCaps(); m_texture3DSupported = !!(caps->supported & BGFX_CAPS_TEXTURE_3D); diff --git a/3rdparty/bgfx/examples/09-hdr/hdr.cpp b/3rdparty/bgfx/examples/09-hdr/hdr.cpp index dfe6f7dd390..2c5f99e31c9 100644 --- a/3rdparty/bgfx/examples/09-hdr/hdr.cpp +++ b/3rdparty/bgfx/examples/09-hdr/hdr.cpp @@ -178,7 +178,7 @@ class ExampleHDR : public entry::AppI bgfx::setViewName(8, "Blur vertical"); bgfx::setViewName(9, "Blur horizontal + tonemap"); - m_uffizi = loadTexture("uffizi.dds" + m_uffizi = loadTexture("textures/uffizi.dds" , 0 | BGFX_TEXTURE_U_CLAMP | BGFX_TEXTURE_V_CLAMP diff --git a/3rdparty/bgfx/examples/12-lod/lod.cpp b/3rdparty/bgfx/examples/12-lod/lod.cpp index 7e79c36b28f..d19a9044d3c 100644 --- a/3rdparty/bgfx/examples/12-lod/lod.cpp +++ b/3rdparty/bgfx/examples/12-lod/lod.cpp @@ -54,8 +54,8 @@ class ExampleLod : public entry::AppI m_program = loadProgram("vs_tree", "fs_tree"); - m_textureLeafs = loadTexture("leafs1.dds"); - m_textureBark = loadTexture("bark1.dds"); + m_textureLeafs = loadTexture("textures/leafs1.dds"); + m_textureBark = loadTexture("textures/bark1.dds"); const bgfx::Memory* stippleTex = bgfx::alloc(8*4); memset(stippleTex->data, 0, stippleTex->size); diff --git a/3rdparty/bgfx/examples/13-stencil/stencil.cpp b/3rdparty/bgfx/examples/13-stencil/stencil.cpp index 53d484e2137..39d7c67883d 100644 --- a/3rdparty/bgfx/examples/13-stencil/stencil.cpp +++ b/3rdparty/bgfx/examples/13-stencil/stencil.cpp @@ -873,9 +873,9 @@ int _main_(int _argc, char** _argv) hplaneMesh.load(s_hplaneVertices, BX_COUNTOF(s_hplaneVertices), PosNormalTexcoordVertex::ms_decl, s_planeIndices, BX_COUNTOF(s_planeIndices) ); vplaneMesh.load(s_vplaneVertices, BX_COUNTOF(s_vplaneVertices), PosNormalTexcoordVertex::ms_decl, s_planeIndices, BX_COUNTOF(s_planeIndices) ); - bgfx::TextureHandle figureTex = loadTexture("figure-rgba.dds"); - bgfx::TextureHandle flareTex = loadTexture("flare.dds"); - bgfx::TextureHandle fieldstoneTex = loadTexture("fieldstone-rgba.dds"); + bgfx::TextureHandle figureTex = loadTexture("textures/figure-rgba.dds"); + bgfx::TextureHandle flareTex = loadTexture("textures/flare.dds"); + bgfx::TextureHandle fieldstoneTex = loadTexture("textures/fieldstone-rgba.dds"); // Setup lights. const float rgbInnerR[][4] = diff --git a/3rdparty/bgfx/examples/14-shadowvolumes/shadowvolumes.cpp b/3rdparty/bgfx/examples/14-shadowvolumes/shadowvolumes.cpp index 093b168d42f..8b08dec93cb 100644 --- a/3rdparty/bgfx/examples/14-shadowvolumes/shadowvolumes.cpp +++ b/3rdparty/bgfx/examples/14-shadowvolumes/shadowvolumes.cpp @@ -1878,9 +1878,9 @@ int _main_(int _argc, char** _argv) s_uniforms.init(); s_uniforms.submitConstUniforms(); - bgfx::TextureHandle figureTex = loadTexture("figure-rgba.dds"); - bgfx::TextureHandle flareTex = loadTexture("flare.dds"); - bgfx::TextureHandle fieldstoneTex = loadTexture("fieldstone-rgba.dds"); + bgfx::TextureHandle figureTex = loadTexture("textures/figure-rgba.dds"); + bgfx::TextureHandle flareTex = loadTexture("textures/flare.dds"); + bgfx::TextureHandle fieldstoneTex = loadTexture("textures/fieldstone-rgba.dds"); bgfx::TextureHandle fbtextures[] = { diff --git a/3rdparty/bgfx/examples/16-shadowmaps/shadowmaps.cpp b/3rdparty/bgfx/examples/16-shadowmaps/shadowmaps.cpp index 3296496b018..76e6278045e 100644 --- a/3rdparty/bgfx/examples/16-shadowmaps/shadowmaps.cpp +++ b/3rdparty/bgfx/examples/16-shadowmaps/shadowmaps.cpp @@ -1379,9 +1379,9 @@ int _main_(int _argc, char** _argv) PosColorTexCoord0Vertex::init(); // Textures. - bgfx::TextureHandle texFigure = loadTexture("figure-rgba.dds"); - bgfx::TextureHandle texFlare = loadTexture("flare.dds"); - bgfx::TextureHandle texFieldstone = loadTexture("fieldstone-rgba.dds"); + bgfx::TextureHandle texFigure = loadTexture("textures/figure-rgba.dds"); + bgfx::TextureHandle texFlare = loadTexture("textures/flare.dds"); + bgfx::TextureHandle texFieldstone = loadTexture("textures/fieldstone-rgba.dds"); // Meshes. Mesh bunnyMesh; diff --git a/3rdparty/bgfx/examples/18-ibl/ibl.cpp b/3rdparty/bgfx/examples/18-ibl/ibl.cpp index a0cf6268d9c..c21b729ae46 100644 --- a/3rdparty/bgfx/examples/18-ibl/ibl.cpp +++ b/3rdparty/bgfx/examples/18-ibl/ibl.cpp @@ -156,12 +156,10 @@ struct LightProbe { char filePath[512]; - strcpy(filePath, _name); - strcat(filePath, "_lod.dds"); + bx::snprintf(filePath, BX_COUNTOF(filePath), "textures/%s_lod.dds", _name); m_tex = loadTexture(filePath, BGFX_TEXTURE_U_CLAMP|BGFX_TEXTURE_V_CLAMP|BGFX_TEXTURE_W_CLAMP); - strcpy(filePath, _name); - strcat(filePath, "_irr.dds"); + bx::snprintf(filePath, BX_COUNTOF(filePath), "textures/%s_irr.dds", _name); m_texIrr = loadTexture(filePath, BGFX_TEXTURE_U_CLAMP|BGFX_TEXTURE_V_CLAMP|BGFX_TEXTURE_W_CLAMP); } diff --git a/3rdparty/bgfx/examples/21-deferred/deferred.cpp b/3rdparty/bgfx/examples/21-deferred/deferred.cpp index fbf5c546022..5cb3d3951d3 100644 --- a/3rdparty/bgfx/examples/21-deferred/deferred.cpp +++ b/3rdparty/bgfx/examples/21-deferred/deferred.cpp @@ -293,10 +293,10 @@ class ExampleDeferred : public entry::AppI m_lineProgram = loadProgram("vs_deferred_debug_line", "fs_deferred_debug_line"); // Load diffuse texture. - m_textureColor = loadTexture("fieldstone-rgba.dds"); + m_textureColor = loadTexture("textures/fieldstone-rgba.dds"); // Load normal texture. - m_textureNormal = loadTexture("fieldstone-n.dds"); + m_textureNormal = loadTexture("textures/fieldstone-n.dds"); m_gbufferTex[0].idx = bgfx::invalidHandle; m_gbufferTex[1].idx = bgfx::invalidHandle; diff --git a/3rdparty/bgfx/examples/23-vectordisplay/vectordisplay.cpp b/3rdparty/bgfx/examples/23-vectordisplay/vectordisplay.cpp index 74bcbc9eb12..82d9dbd1c40 100644 --- a/3rdparty/bgfx/examples/23-vectordisplay/vectordisplay.cpp +++ b/3rdparty/bgfx/examples/23-vectordisplay/vectordisplay.cpp @@ -33,26 +33,16 @@ const float DEFAULT_BRIGHTNESS = 1.0f; const int TEXTURE_SIZE = 64; const int HALF_TEXTURE_SIZE = TEXTURE_SIZE / 2; -struct PosColorUvVertex +void PosColorUvVertex::init() { - float m_x; - float m_y; - float m_z; - float m_u; - float m_v; - uint32_t m_abgr; + ms_decl + .begin() + .add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float) + .add(bgfx::Attrib::TexCoord0, 2, bgfx::AttribType::Float) + .add(bgfx::Attrib::Color0, 4, bgfx::AttribType::Uint8, true) + .end(); +} - static void init() - { - ms_decl - .begin() - .add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float) - .add(bgfx::Attrib::TexCoord0, 2, bgfx::AttribType::Float) - .add(bgfx::Attrib::Color0, 4, bgfx::AttribType::Uint8, true) - .end(); - } - static bgfx::VertexDecl ms_decl; -}; bgfx::VertexDecl PosColorUvVertex::ms_decl; inline float normalizef(float _a) @@ -156,7 +146,7 @@ void VectorDisplay::endFrame() bgfx::updateDynamicVertexBuffer(m_vertexBuffers[m_currentDrawStep] , 0 - , bgfx::copy(m_points.data(), (uint32_t)m_points.size() * sizeof(point_t) ) + , bgfx::copy(m_points.data(), (uint32_t)m_points.size() * sizeof(PosColorUvVertex) ) ); m_vertexBuffersSize[m_currentDrawStep] = (uint32_t)m_points.size(); @@ -307,7 +297,7 @@ void VectorDisplay::beginDraw(float _x, float _y) { BX_CHECK(0 == m_pendingPoints.size(), "Begin draw on already filled buffer!"); - pending_point_t point; + PendingPoint point; point.x = _x * m_drawScale + m_drawOffsetX; point.y = _y * m_drawScale + m_drawOffsetY; m_pendingPoints.push_back(point); @@ -315,7 +305,7 @@ void VectorDisplay::beginDraw(float _x, float _y) void VectorDisplay::drawTo(float _x, float _y) { - pending_point_t point; + PendingPoint point; point.x = _x * m_drawScale + m_drawOffsetX; point.y = _y * m_drawScale + m_drawOffsetY; m_pendingPoints.push_back(point); @@ -331,7 +321,7 @@ void VectorDisplay::endDraw() // from the list of points, build a list of lines uint32_t nlines = (uint32_t)m_pendingPoints.size() - 1; - line_t* lines = (line_t*)alloca(nlines * sizeof(line_t) ); + Line* lines = (Line*)alloca(nlines * sizeof(Line) ); float t = effectiveThickness(); int first_last_same = bx::fabsolute(m_pendingPoints[0].x - m_pendingPoints[m_pendingPoints.size() - 1].x) < 0.1 @@ -340,7 +330,7 @@ void VectorDisplay::endDraw() // compute basics for (size_t i = 1; i < m_pendingPoints.size(); i++) { - line_t* line = &lines[i - 1]; + Line* line = &lines[i - 1]; line->is_first = i == 1; line->is_last = i == nlines; @@ -370,7 +360,7 @@ void VectorDisplay::endDraw() // compute adjustments for connected line segments for (size_t i = 0; i < nlines; i++) { - line_t* line = &lines[i], * pline = &lines[(nlines + i - 1) % nlines]; + Line* line = &lines[i], * pline = &lines[(nlines + i - 1) % nlines]; if (line->has_prev) { @@ -428,7 +418,7 @@ void VectorDisplay::endDraw() // compute line geometry for (size_t i = 0; i < nlines; i++) { - line_t* line = &lines[i]; + Line* line = &lines[i]; // shorten lines if needed line->x0 = line->x0 + line->s0 * line->cos_a; @@ -592,13 +582,13 @@ void VectorDisplay::setDrawColor(float _r, float _g, float _b, float _a) void VectorDisplay::appendTexpoint(float _x, float _y, float _u, float _v) { - point_t point; - point.x = _x; - point.y = _y; - point.z = 0.0; - point.color = (m_drawColorA << 24) | (m_drawColorB << 16) | (m_drawColorG << 8) | m_drawColorR; - point.u = _u / TEXTURE_SIZE; - point.v = 1.0f - _v / TEXTURE_SIZE; + PosColorUvVertex point; + point.m_x = _x; + point.m_y = _y; + point.m_z = 0.0; + point.m_abgr = (m_drawColorA << 24) | (m_drawColorB << 16) | (m_drawColorG << 8) | m_drawColorR; + point.m_u = _u / TEXTURE_SIZE; + point.m_v = 1.0f - _v / TEXTURE_SIZE; m_points.push_back(point); } @@ -638,14 +628,14 @@ void VectorDisplay::drawFan(float _cx, float _cy, float _pa, float _a, float _t, } } -void VectorDisplay::drawLines(line_t* _lines, int _numberLines) +void VectorDisplay::drawLines(Line* _lines, int _numberLines) { int i; float t = effectiveThickness(); for (i = 0; i < _numberLines; i++) { - line_t* line = &_lines[i], * pline = &_lines[(_numberLines + i - 1) % _numberLines]; + Line* line = &_lines[i], * pline = &_lines[(_numberLines + i - 1) % _numberLines]; if (line->has_prev) // draw fan for connection to previous { diff --git a/3rdparty/bgfx/examples/23-vectordisplay/vectordisplay.h b/3rdparty/bgfx/examples/23-vectordisplay/vectordisplay.h index 049fcd9a906..b11400eb933 100644 --- a/3rdparty/bgfx/examples/23-vectordisplay/vectordisplay.h +++ b/3rdparty/bgfx/examples/23-vectordisplay/vectordisplay.h @@ -18,6 +18,19 @@ #include namespace stl = tinystl; +struct PosColorUvVertex +{ + float m_x; + float m_y; + float m_z; + float m_u; + float m_v; + uint32_t m_abgr; + + static void init(); + static bgfx::VertexDecl ms_decl; +}; + class VectorDisplay { public: @@ -103,19 +116,12 @@ public: protected: void screenSpaceQuad(float _textureWidth, float _textureHeight, float _width = 1.0f, float _height = 1.0f); - typedef struct //has to match the spec submitted to the 3d-api! - { - float x, y, z; - float u, v; - uint32_t color; - } point_t; - - typedef struct + struct PendingPoint { float x, y; - } pending_point_t; + }; - typedef struct + struct Line { float x0, y0, x1, y1; // nominal points float a; // angle @@ -135,7 +141,7 @@ protected: float s0, s1; // shorten line by this amount float len; - } line_t; + }; float effectiveThickness(); void setupResDependent(); @@ -144,7 +150,7 @@ protected: void appendTexpoint(float _x, float _y, float _u, float _v); void drawFan(float _cx, float _cy, float _pa, float _a, float _t, float _s, float _e); - void drawLines(line_t* _lines, int _numberLines); + void drawLines(Line* _lines, int _numberLines); void genLinetex(); bool m_originBottomLeft; @@ -170,8 +176,8 @@ protected: float m_decayValue; uint8_t m_drawColorR, m_drawColorG, m_drawColorB, m_drawColorA; - stl::vector m_points; - stl::vector m_pendingPoints; + stl::vector m_points; + stl::vector m_pendingPoints; int m_currentDrawStep; stl::vector m_vertexBuffers; diff --git a/3rdparty/bgfx/examples/common/bgfx_utils.cpp b/3rdparty/bgfx/examples/common/bgfx_utils.cpp index 8de8bf30964..44d27300649 100644 --- a/3rdparty/bgfx/examples/common/bgfx_utils.cpp +++ b/3rdparty/bgfx/examples/common/bgfx_utils.cpp @@ -156,28 +156,20 @@ bgfx::ProgramHandle loadProgram(const char* _vsName, const char* _fsName) typedef unsigned char stbi_uc; extern "C" stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); -bgfx::TextureHandle loadTexture(bx::FileReaderI* _reader, const char* _name, uint32_t _flags, uint8_t _skip, bgfx::TextureInfo* _info) +bgfx::TextureHandle loadTexture(bx::FileReaderI* _reader, const char* _filePath, uint32_t _flags, uint8_t _skip, bgfx::TextureInfo* _info) { - char filePath[512] = { '\0' }; - if (NULL == strchr(_name, '/') ) + if (NULL != bx::stristr(_filePath, ".dds") + || NULL != bx::stristr(_filePath, ".pvr") + || NULL != bx::stristr(_filePath, ".ktx") ) { - strcpy(filePath, "textures/"); - } - - strcat(filePath, _name); - - if (NULL != bx::stristr(_name, ".dds") - || NULL != bx::stristr(_name, ".pvr") - || NULL != bx::stristr(_name, ".ktx") ) - { - const bgfx::Memory* mem = loadMem(_reader, filePath); + const bgfx::Memory* mem = loadMem(_reader, _filePath); if (NULL != mem) { return bgfx::createTexture(mem, _flags, _skip, _info); } bgfx::TextureHandle handle = BGFX_INVALID_HANDLE; - DBG("Failed to load %s.", filePath); + DBG("Failed to load %s.", _filePath); return handle; } @@ -185,7 +177,7 @@ bgfx::TextureHandle loadTexture(bx::FileReaderI* _reader, const char* _name, uin bx::AllocatorI* allocator = entry::getAllocator(); uint32_t size = 0; - void* data = loadMem(_reader, allocator, filePath, &size); + void* data = loadMem(_reader, allocator, _filePath, &size); if (NULL != data) { int width = 0; @@ -222,7 +214,7 @@ bgfx::TextureHandle loadTexture(bx::FileReaderI* _reader, const char* _name, uin } else { - DBG("Failed to load %s.", filePath); + DBG("Failed to load %s.", _filePath); } return handle; diff --git a/3rdparty/bgfx/examples/common/entry/entry.cpp b/3rdparty/bgfx/examples/common/entry/entry.cpp index 03cf82b5373..919a783c9dc 100644 --- a/3rdparty/bgfx/examples/common/entry/entry.cpp +++ b/3rdparty/bgfx/examples/common/entry/entry.cpp @@ -463,8 +463,8 @@ BX_PRAGMA_DIAGNOSTIC_POP(); case Event::Gamepad: { - const GamepadEvent* gev = static_cast(ev); - DBG("gamepad %d, %d", gev->m_gamepad.idx, gev->m_connected); +// const GamepadEvent* gev = static_cast(ev); +// DBG("gamepad %d, %d", gev->m_gamepad.idx, gev->m_connected); } break; diff --git a/3rdparty/bgfx/examples/common/entry/entry_sdl.cpp b/3rdparty/bgfx/examples/common/entry/entry_sdl.cpp index 07193b83ca7..0e4f49424e2 100644 --- a/3rdparty/bgfx/examples/common/entry/entry_sdl.cpp +++ b/3rdparty/bgfx/examples/common/entry/entry_sdl.cpp @@ -49,6 +49,25 @@ namespace entry return modifiers; } + static uint8_t translateKeyModifierPress(uint16_t _key) + { + uint8_t modifier; + switch (_key) + { + case SDL_SCANCODE_LALT: { modifier = Modifier::LeftAlt; } break; + case SDL_SCANCODE_RALT: { modifier = Modifier::RightAlt; } break; + case SDL_SCANCODE_LCTRL: { modifier = Modifier::LeftCtrl; } break; + case SDL_SCANCODE_RCTRL: { modifier = Modifier::RightCtrl; } break; + case SDL_SCANCODE_LSHIFT: { modifier = Modifier::LeftShift; } break; + case SDL_SCANCODE_RSHIFT: { modifier = Modifier::RightShift; } break; + case SDL_SCANCODE_LGUI: { modifier = Modifier::LeftMeta; } break; + case SDL_SCANCODE_RGUI: { modifier = Modifier::RightMeta; } break; + default: { modifier = 0; } break; + } + + return modifier; + } + static uint8_t s_translateKey[256]; static void initTranslateKey(uint16_t _sdl, Key::Enum _key) @@ -307,8 +326,15 @@ namespace entry initTranslateKey(SDL_SCANCODE_END, Key::End); initTranslateKey(SDL_SCANCODE_PRINTSCREEN, Key::Print); initTranslateKey(SDL_SCANCODE_KP_PLUS, Key::Plus); + initTranslateKey(SDL_SCANCODE_EQUALS, Key::Plus); initTranslateKey(SDL_SCANCODE_KP_MINUS, Key::Minus); + initTranslateKey(SDL_SCANCODE_MINUS, Key::Minus); initTranslateKey(SDL_SCANCODE_GRAVE, Key::Tilde); + initTranslateKey(SDL_SCANCODE_KP_COMMA, Key::Comma); + initTranslateKey(SDL_SCANCODE_COMMA, Key::Comma); + initTranslateKey(SDL_SCANCODE_KP_PERIOD, Key::Period); + initTranslateKey(SDL_SCANCODE_PERIOD, Key::Period); + initTranslateKey(SDL_SCANCODE_SLASH, Key::Slash); initTranslateKey(SDL_SCANCODE_F1, Key::F1); initTranslateKey(SDL_SCANCODE_F2, Key::F2); initTranslateKey(SDL_SCANCODE_F3, Key::F3); @@ -532,29 +558,43 @@ namespace entry uint8_t modifiers = translateKeyModifiers(kev.keysym.mod); Key::Enum key = translateKey(kev.keysym.scancode); - // TODO: These keys are not captured by SDL_TEXTINPUT. Should be probably handled by SDL_TEXTEDITING. This is a workaround for now. - if (key == 1) // Escape +#if 0 + DBG("SDL scancode %d, key %d, name %s, key name %s" + , kev.keysym.scancode + , key + , SDL_GetScancodeName(kev.keysym.scancode) + , SDL_GetKeyName(kev.keysym.scancode) + ); +#endif // 0 + + /// If you only press (e.g.) 'shift' and nothing else, then key == 'shift', modifier == 0. + /// Further along, pressing 'shift' + 'ctrl' would be: key == 'shift', modifier == 'ctrl. + if (0 == key && 0 == modifiers) + { + modifiers = translateKeyModifierPress(kev.keysym.scancode); + } + + /// TODO: These keys are not captured by SDL_TEXTINPUT. Should be probably handled by SDL_TEXTEDITING. This is a workaround for now. + if (Key::Esc == key) { uint8_t pressedChar[4]; pressedChar[0] = 0x1b; m_eventQueue.postCharEvent(handle, 1, pressedChar); } - else if (key == 2) // Enter + else if (Key::Return == key) { uint8_t pressedChar[4]; pressedChar[0] = 0x0d; m_eventQueue.postCharEvent(handle, 1, pressedChar); } - else if (key == 5) // Backspace + else if (Key::Backspace == key) { uint8_t pressedChar[4]; pressedChar[0] = 0x08; m_eventQueue.postCharEvent(handle, 1, pressedChar); } - else - { - m_eventQueue.postKeyEvent(handle, key, modifiers, kev.state == SDL_PRESSED); - } + + m_eventQueue.postKeyEvent(handle, key, modifiers, kev.state == SDL_PRESSED); } } break; diff --git a/3rdparty/bgfx/examples/common/entry/entry_winrt.cpp b/3rdparty/bgfx/examples/common/entry/entry_winrt.cx similarity index 94% rename from 3rdparty/bgfx/examples/common/entry/entry_winrt.cpp rename to 3rdparty/bgfx/examples/common/entry/entry_winrt.cx index 9edbc36e92a..796d1f64f48 100644 --- a/3rdparty/bgfx/examples/common/entry/entry_winrt.cpp +++ b/3rdparty/bgfx/examples/common/entry/entry_winrt.cx @@ -115,15 +115,15 @@ private: m_windowVisible = args->Visible; } - void OnSuspending(Platform::Object^ sender, SuspendingEventArgs^ args) - { - SuspendingDeferral^ deferral = args->SuspendingOperation->GetDeferral(); + void OnSuspending(Platform::Object^ sender, SuspendingEventArgs^ args) + { + SuspendingDeferral^ deferral = args->SuspendingOperation->GetDeferral(); BX_UNUSED(deferral); - } + } - void OnResuming(Platform::Object^ sender, Platform::Object^ args) - { - } + void OnResuming(Platform::Object^ sender, Platform::Object^ args) + { + } void OnWindowClosed(CoreWindow^ sender, CoreWindowEventArgs^ args) { diff --git a/3rdparty/bgfx/examples/common/entry/input.cpp b/3rdparty/bgfx/examples/common/entry/input.cpp index bb9925990b0..b63e0ea6d6d 100644 --- a/3rdparty/bgfx/examples/common/entry/input.cpp +++ b/3rdparty/bgfx/examples/common/entry/input.cpp @@ -16,9 +16,9 @@ #include namespace stl = tinystl; -struct Mouse +struct InputMouse { - Mouse() + InputMouse() : m_width(1280) , m_height(720) , m_wheelDelta(120) @@ -69,10 +69,10 @@ struct Mouse bool m_lock; }; -struct Keyboard +struct InputKeyboard { - Keyboard() - : m_ring(BX_COUNTOF(m_char) ) + InputKeyboard() + : m_ring(BX_COUNTOF(m_char)-4) { } @@ -215,7 +215,7 @@ struct Input for (const InputBinding* binding = _bindings; binding->m_key != entry::Key::None; ++binding) { uint8_t modifiers; - bool down = Keyboard::decodeKeyState(m_keyboard.m_key[binding->m_key], modifiers); + bool down = InputKeyboard::decodeKeyState(m_keyboard.m_key[binding->m_key], modifiers); if (binding->m_flags == 1) { @@ -278,8 +278,8 @@ struct Input typedef stl::unordered_map InputBindingMap; InputBindingMap m_inputBindingsMap; - Mouse m_mouse; - Keyboard m_keyboard; + InputKeyboard m_keyboard; + InputMouse m_mouse; Gamepad m_gamepad[ENTRY_CONFIG_MAX_GAMEPADS]; }; diff --git a/3rdparty/bgfx/examples/common/imgui/imgui.h b/3rdparty/bgfx/examples/common/imgui/imgui.h index 0ab18cb9f8a..16313f1b3c9 100644 --- a/3rdparty/bgfx/examples/common/imgui/imgui.h +++ b/3rdparty/bgfx/examples/common/imgui/imgui.h @@ -273,6 +273,11 @@ namespace ImGui return ImageButton(_handle, IMGUI_FLAGS_ALPHA_BLEND, 0, _size, _uv0, _uv1, _framePadding, _bgCol, _tintCol); } + inline void NextLine() + { + SetCursorPosY(GetCursorPosY() + GetTextLineHeightWithSpacing() ); + } + } // namespace ImGui #endif // IMGUI_H_HEADER_GUARD diff --git a/3rdparty/bgfx/include/bgfx/bgfxdefines.h b/3rdparty/bgfx/include/bgfx/bgfxdefines.h index 6dff557b541..69fcea60aa8 100644 --- a/3rdparty/bgfx/include/bgfx/bgfxdefines.h +++ b/3rdparty/bgfx/include/bgfx/bgfxdefines.h @@ -6,7 +6,7 @@ #ifndef BGFX_DEFINES_H_HEADER_GUARD #define BGFX_DEFINES_H_HEADER_GUARD -#define BGFX_API_VERSION UINT32_C(13) +#define BGFX_API_VERSION UINT32_C(14) /// #define BGFX_STATE_RGB_WRITE UINT64_C(0x0000000000000001) //!< Enable RGB write. @@ -296,6 +296,7 @@ #define BGFX_TEXTURE_MIP_POINT UINT32_C(0x00000400) //!< #define BGFX_TEXTURE_MIP_SHIFT 10 //!< #define BGFX_TEXTURE_MIP_MASK UINT32_C(0x00000400) //!< +#define BGFX_TEXTURE_MSAA_SAMPLE UINT32_C(0x00000800) //!< #define BGFX_TEXTURE_RT UINT32_C(0x00001000) //!< #define BGFX_TEXTURE_RT_MSAA_X2 UINT32_C(0x00002000) //!< #define BGFX_TEXTURE_RT_MSAA_X4 UINT32_C(0x00003000) //!< diff --git a/3rdparty/bgfx/include/bgfx/c99/bgfx.h b/3rdparty/bgfx/include/bgfx/c99/bgfx.h index 92793335336..9f6fde039be 100644 --- a/3rdparty/bgfx/include/bgfx/c99/bgfx.h +++ b/3rdparty/bgfx/include/bgfx/c99/bgfx.h @@ -278,7 +278,8 @@ typedef struct bgfx_hmd_eye float rotation[4]; float translation[3]; float fov[4]; - float adjust[3]; + float viewOffset[3]; + float projection[16]; float pixelsPerTanAngle[2]; } bgfx_hmd_eye_t; @@ -298,10 +299,12 @@ typedef struct bgfx_hmd /**/ typedef struct bgfx_stats { - uint64_t cpuTime; + uint64_t cpuTimeBegin; + uint64_t cpuTimeEnd; uint64_t cpuTimerFreq; - uint64_t gpuTime; + uint64_t gpuTimeBegin; + uint64_t gpuTimeEnd; uint64_t gpuTimerFreq; } bgfx_stats_t; diff --git a/3rdparty/bgfx/makefile b/3rdparty/bgfx/makefile index 30f3e3eb9c4..e69671486f0 100644 --- a/3rdparty/bgfx/makefile +++ b/3rdparty/bgfx/makefile @@ -324,18 +324,22 @@ EXE=.exe endif geometryc: .build/projects/$(BUILD_PROJECT_DIR) ## Build geometryc tool. - $(SILENT) $(MAKE) -C .build/projects/$(BUILD_PROJECT_DIR) -f geometryc.make config=$(BUILD_TOOLS_CONFIG) + $(SILENT) $(MAKE) -C .build/projects/$(BUILD_PROJECT_DIR) geometryc config=$(BUILD_TOOLS_CONFIG) $(SILENT) cp .build/$(BUILD_OUTPUT_DIR)/bin/geometryc$(BUILD_TOOLS_SUFFIX)$(EXE) tools/bin/$(OS)/geometryc$(EXE) shaderc: .build/projects/$(BUILD_PROJECT_DIR) ## Build shaderc tool. - $(SILENT) $(MAKE) -C .build/projects/$(BUILD_PROJECT_DIR) -f shaderc.make config=$(BUILD_TOOLS_CONFIG) + $(SILENT) $(MAKE) -C .build/projects/$(BUILD_PROJECT_DIR) shaderc config=$(BUILD_TOOLS_CONFIG) $(SILENT) cp .build/$(BUILD_OUTPUT_DIR)/bin/shaderc$(BUILD_TOOLS_SUFFIX)$(EXE) tools/bin/$(OS)/shaderc$(EXE) texturec: .build/projects/$(BUILD_PROJECT_DIR) ## Build texturec tool. - $(SILENT) $(MAKE) -C .build/projects/$(BUILD_PROJECT_DIR) -f texturec.make config=$(BUILD_TOOLS_CONFIG) + $(SILENT) $(MAKE) -C .build/projects/$(BUILD_PROJECT_DIR) texturec config=$(BUILD_TOOLS_CONFIG) $(SILENT) cp .build/$(BUILD_OUTPUT_DIR)/bin/texturec$(BUILD_TOOLS_SUFFIX)$(EXE) tools/bin/$(OS)/texturec$(EXE) -tools: geometryc shaderc texturec ## Build tools. +texturev: .build/projects/$(BUILD_PROJECT_DIR) ## Build texturev tool. + $(SILENT) $(MAKE) -C .build/projects/$(BUILD_PROJECT_DIR) texturev config=$(BUILD_TOOLS_CONFIG) + $(SILENT) cp .build/$(BUILD_OUTPUT_DIR)/bin/texturev$(BUILD_TOOLS_SUFFIX)$(EXE) tools/bin/$(OS)/texturev$(EXE) + +tools: geometryc shaderc texturec texturev ## Build tools. dist-windows: .build/projects/gmake-mingw-gcc $(SILENT) $(MAKE) -C .build/projects/gmake-mingw-gcc config=release64 -j 6 geometryc diff --git a/3rdparty/bgfx/scripts/example-common.lua b/3rdparty/bgfx/scripts/example-common.lua index fcaca364f64..078877feadf 100644 --- a/3rdparty/bgfx/scripts/example-common.lua +++ b/3rdparty/bgfx/scripts/example-common.lua @@ -19,6 +19,7 @@ project ("example-common") path.join(BGFX_DIR, "3rdparty/ocornut-imgui/**.cpp"), path.join(BGFX_DIR, "3rdparty/ocornut-imgui/**.h"), path.join(BGFX_DIR, "examples/common/**.cpp"), + path.join(BGFX_DIR, "examples/common/**.cpp"), path.join(BGFX_DIR, "examples/common/**.h"), } @@ -60,7 +61,7 @@ project ("example-common") "ENTRY_CONFIG_USE_GLFW=1", } end - + configuration { "linux-steamlink" } defines { "EGL_API_FB", @@ -71,7 +72,10 @@ project ("example-common") path.join(BGFX_DIR, "examples/common/**.mm"), } - configuration { "winphone8* or winstore8*"} + configuration { "winphone8* or winstore8* or durango"} + files { + path.join(BGFX_DIR, "examples/common/**.cx"), + } linkoptions { "/ignore:4264" -- LNK4264: archiving object file compiled with /ZW into a static library; note that when authoring Windows Runtime types it is not recommended to link with a static library that contains Windows Runtime metadata } diff --git a/3rdparty/bgfx/scripts/genie.lua b/3rdparty/bgfx/scripts/genie.lua index 3cf7e9b4b76..ce34df5d990 100644 --- a/3rdparty/bgfx/scripts/genie.lua +++ b/3rdparty/bgfx/scripts/genie.lua @@ -65,8 +65,9 @@ solution "bgfx" language "C++" startproject "example-00-helloworld" -BGFX_DIR = path.getabsolute("..") -BX_DIR = os.getenv("BX_DIR") +MODULE_DIR = path.getabsolute("../") +BGFX_DIR = path.getabsolute("..") +BX_DIR = os.getenv("BX_DIR") local BGFX_BUILD_DIR = path.join(BGFX_DIR, ".build") local BGFX_THIRD_PARTY_DIR = path.join(BGFX_DIR, "3rdparty") @@ -405,5 +406,6 @@ if _OPTIONS["with-tools"] then group "tools" dofile "shaderc.lua" dofile "texturec.lua" + dofile "texturev.lua" dofile "geometryc.lua" end diff --git a/3rdparty/bgfx/scripts/texturev.lua b/3rdparty/bgfx/scripts/texturev.lua new file mode 100644 index 00000000000..4a04cff4cbd --- /dev/null +++ b/3rdparty/bgfx/scripts/texturev.lua @@ -0,0 +1,233 @@ +project ("texturev") + uuid (os.uuid("texturev") ) + kind "ConsoleApp" + + configuration {} + + includedirs { + path.join(BX_DIR, "include"), + path.join(BGFX_DIR, "include"), + path.join(BGFX_DIR, "3rdparty"), + path.join(BGFX_DIR, "examples/common"), + path.join(MODULE_DIR, "include"), + path.join(MODULE_DIR, "3rdparty"), + path.join(MODULE_DIR, "src"), + } + + files { + path.join(MODULE_DIR, "tools/texturev/**"), + } + + links { + "example-common", + "bgfx", + } + + if _OPTIONS["with-sdl"] then + defines { "ENTRY_CONFIG_USE_SDL=1" } + links { "SDL2" } + + configuration { "x32", "windows" } + libdirs { "$(SDL2_DIR)/lib/x86" } + + configuration { "x64", "windows" } + libdirs { "$(SDL2_DIR)/lib/x64" } + + configuration {} + end + + if _OPTIONS["with-glfw"] then + defines { "ENTRY_CONFIG_USE_GLFW=1" } + links { + "glfw3" + } + + configuration { "linux or freebsd" } + links { + "Xrandr", + "Xinerama", + "Xi", + "Xxf86vm", + "Xcursor", + } + + configuration { "osx" } + linkoptions { + "-framework CoreVideo", + "-framework IOKit", + } + + configuration {} + end + + if _OPTIONS["with-ovr"] then + links { + "winmm", + "ws2_32", + } + + -- Check for LibOVR 5.0+ + if os.isdir(path.join(os.getenv("OVR_DIR"), "LibOVR/Lib/Windows/Win32/Debug/VS2012")) then + + configuration { "x32", "Debug" } + libdirs { path.join("$(OVR_DIR)/LibOVR/Lib/Windows/Win32/Debug", _ACTION) } + + configuration { "x32", "Release" } + libdirs { path.join("$(OVR_DIR)/LibOVR/Lib/Windows/Win32/Release", _ACTION) } + + configuration { "x64", "Debug" } + libdirs { path.join("$(OVR_DIR)/LibOVR/Lib/Windows/x64/Debug", _ACTION) } + + configuration { "x64", "Release" } + libdirs { path.join("$(OVR_DIR)/LibOVR/Lib/Windows/x64/Release", _ACTION) } + + configuration { "x32 or x64" } + links { "libovr" } + else + configuration { "x32" } + libdirs { path.join("$(OVR_DIR)/LibOVR/Lib/Win32", _ACTION) } + + configuration { "x64" } + libdirs { path.join("$(OVR_DIR)/LibOVR/Lib/x64", _ACTION) } + + configuration { "x32", "Debug" } + links { "libovrd" } + + configuration { "x32", "Release" } + links { "libovr" } + + configuration { "x64", "Debug" } + links { "libovr64d" } + + configuration { "x64", "Release" } + links { "libovr64" } + end + + configuration {} + end + + configuration { "vs*" } + linkoptions { + "/ignore:4199", -- LNK4199: /DELAYLOAD:*.dll ignored; no imports found from *.dll + } + links { -- this is needed only for testing with GLES2/3 on Windows with VS2008 + "DelayImp", + } + + configuration { "vs201*" } + linkoptions { -- this is needed only for testing with GLES2/3 on Windows with VS201x + "/DELAYLOAD:\"libEGL.dll\"", + "/DELAYLOAD:\"libGLESv2.dll\"", + } + + configuration { "mingw*" } + targetextension ".exe" + + configuration { "vs20* or mingw*" } + links { + "gdi32", + "psapi", + } + + configuration { "winphone8*"} + removelinks { + "DelayImp", + "gdi32", + "psapi" + } + links { + "d3d11", + "dxgi" + } + linkoptions { + "/ignore:4264" -- LNK4264: archiving object file compiled with /ZW into a static library; note that when authoring Windows Runtime types it is not recommended to link with a static library that contains Windows Runtime metadata + } + -- WinRT targets need their own output directories are build files stomp over each other + targetdir (path.join(BGFX_BUILD_DIR, "arm_" .. _ACTION, "bin", _name)) + objdir (path.join(BGFX_BUILD_DIR, "arm_" .. _ACTION, "obj", _name)) + + configuration { "mingw-clang" } + kind "ConsoleApp" + + configuration { "android*" } + kind "ConsoleApp" + targetextension ".so" + linkoptions { + "-shared", + } + links { + "EGL", + "GLESv2", + } + + configuration { "nacl*" } + kind "ConsoleApp" + targetextension ".nexe" + links { + "ppapi", + "ppapi_gles2", + "pthread", + } + + configuration { "pnacl" } + kind "ConsoleApp" + targetextension ".pexe" + links { + "ppapi", + "ppapi_gles2", + "pthread", + } + + configuration { "asmjs" } + kind "ConsoleApp" + targetextension ".bc" + + configuration { "linux-* or freebsd" } + links { + "X11", + "GL", + "pthread", + } + + configuration { "rpi" } + links { + "X11", + "GLESv2", + "EGL", + "bcm_host", + "vcos", + "vchiq_arm", + "pthread", + } + + configuration { "osx" } + linkoptions { + "-framework Cocoa", + "-framework Metal", + "-framework QuartzCore", + "-framework OpenGL", + } + + configuration { "ios*" } + kind "ConsoleApp" + linkoptions { + "-framework CoreFoundation", + "-framework Foundation", + "-framework OpenGLES", + "-framework UIKit", + "-framework QuartzCore", + } + + configuration { "xcode4", "ios" } + kind "WindowedApp" + + configuration { "qnx*" } + targetextension "" + links { + "EGL", + "GLESv2", + } + + configuration {} + + strip() diff --git a/3rdparty/bgfx/src/amalgamated.cpp b/3rdparty/bgfx/src/amalgamated.cpp index dc6c8f6cd50..90059ad5585 100644 --- a/3rdparty/bgfx/src/amalgamated.cpp +++ b/3rdparty/bgfx/src/amalgamated.cpp @@ -10,6 +10,7 @@ #include "glcontext_wgl.cpp" #include "image.cpp" #include "hmd_ovr.cpp" +#include "hmd_openvr.cpp" #include "debug_renderdoc.cpp" #include "renderer_d3d9.cpp" #include "renderer_d3d11.cpp" diff --git a/3rdparty/bgfx/src/bgfx.cpp b/3rdparty/bgfx/src/bgfx.cpp index 13fc896d710..bf5f020f4f3 100644 --- a/3rdparty/bgfx/src/bgfx.cpp +++ b/3rdparty/bgfx/src/bgfx.cpp @@ -3657,11 +3657,17 @@ BGFX_C99_ENUM_CHECK(bgfx::RenderFrame, BGFX_RENDER_FRAME_COUNT); BX_STATIC_ASSERT(sizeof(_cppstruct) == sizeof(_c99struct) ) BGFX_C99_STRUCT_SIZE_CHECK(bgfx::Memory, bgfx_memory_t); +BGFX_C99_STRUCT_SIZE_CHECK(bgfx::Transform, bgfx_transform_t); +BGFX_C99_STRUCT_SIZE_CHECK(bgfx::HMD::Eye, bgfx_hmd_eye_t); +BGFX_C99_STRUCT_SIZE_CHECK(bgfx::HMD, bgfx_hmd_t); +BGFX_C99_STRUCT_SIZE_CHECK(bgfx::Stats, bgfx_stats_t); BGFX_C99_STRUCT_SIZE_CHECK(bgfx::VertexDecl, bgfx_vertex_decl_t); BGFX_C99_STRUCT_SIZE_CHECK(bgfx::TransientIndexBuffer, bgfx_transient_index_buffer_t); BGFX_C99_STRUCT_SIZE_CHECK(bgfx::TransientVertexBuffer, bgfx_transient_vertex_buffer_t); BGFX_C99_STRUCT_SIZE_CHECK(bgfx::InstanceDataBuffer, bgfx_instance_data_buffer_t); BGFX_C99_STRUCT_SIZE_CHECK(bgfx::TextureInfo, bgfx_texture_info_t); +BGFX_C99_STRUCT_SIZE_CHECK(bgfx::Attachment, bgfx_attachment_t); +BGFX_C99_STRUCT_SIZE_CHECK(bgfx::Caps::GPU, bgfx_caps_gpu_t); BGFX_C99_STRUCT_SIZE_CHECK(bgfx::Caps, bgfx_caps_t); BGFX_C99_STRUCT_SIZE_CHECK(bgfx::PlatformData, bgfx_platform_data_t); BGFX_C99_STRUCT_SIZE_CHECK(bgfx::InternalData, bgfx_internal_data_t); diff --git a/3rdparty/bgfx/src/bgfx_p.h b/3rdparty/bgfx/src/bgfx_p.h index 1bb850e4756..243c23ca291 100644 --- a/3rdparty/bgfx/src/bgfx_p.h +++ b/3rdparty/bgfx/src/bgfx_p.h @@ -2385,7 +2385,10 @@ namespace bgfx } uint32_t offset = (dib.m_startIndex + _startIndex)*indexSize; - uint32_t size = bx::uint32_min(bx::uint32_satsub(dib.m_size, _startIndex*indexSize), _mem->size); + uint32_t size = bx::uint32_min(offset + + bx::uint32_min(bx::uint32_satsub(dib.m_size, _startIndex*indexSize), _mem->size) + , BGFX_CONFIG_DYNAMIC_INDEX_BUFFER_SIZE) - offset + ; BX_CHECK(_mem->size <= size, "Truncating dynamic index buffer update (size %d, mem size %d)." , size , _mem->size @@ -2535,9 +2538,12 @@ namespace bgfx } uint32_t offset = (dvb.m_startVertex + _startVertex)*dvb.m_stride; - uint32_t size = bx::uint32_min(bx::uint32_satsub(dvb.m_size, _startVertex*dvb.m_stride), _mem->size); + uint32_t size = bx::uint32_min(offset + + bx::uint32_min(bx::uint32_satsub(dvb.m_size, _startVertex*dvb.m_stride), _mem->size) + , BGFX_CONFIG_DYNAMIC_VERTEX_BUFFER_SIZE) - offset + ; BX_CHECK(_mem->size <= size, "Truncating dynamic vertex buffer update (size %d, mem size %d)." - , dvb.m_size + , size , _mem->size ); diff --git a/3rdparty/bgfx/src/bgfx_shader.sh b/3rdparty/bgfx/src/bgfx_shader.sh index bd1d1d864c9..e8a909d4be1 100644 --- a/3rdparty/bgfx/src/bgfx_shader.sh +++ b/3rdparty/bgfx/src/bgfx_shader.sh @@ -128,7 +128,6 @@ struct BgfxSamplerCube struct BgfxSampler2DMS { - SamplerState m_sampler; Texture2DMS m_texture; }; @@ -240,11 +239,9 @@ vec4 bgfxTexelFetch(BgfxSampler3D _sampler, ivec3 _coord, int _lod) # define texture2DProj(_sampler, _coord) bgfxTexture2DProj(_sampler, _coord) # define SAMPLER2DMS(_name, _reg) \ - uniform SamplerState _name ## Sampler : register(s[_reg]); \ - uniform Texture2DMS _name ## Texture : register(t[_reg]); \ - static BgfxSampler2DMS _name = { _name ## Sampler, _name ## Texture } + uniform Texture2DMS _name ## Texture : register(t[_reg]); \ + static BgfxSampler2DMS _name = { _name ## Texture } # define sampler2DMS BgfxSampler2DMS -# define texture2DMS(_sampler, _coord, _idx) bgfxTexture2DMS(_sampler, _coord, _idx) # define SAMPLER2DSHADOW(_name, _reg) \ uniform SamplerComparisonState _name ## Sampler : register(s[_reg]); \ diff --git a/3rdparty/bgfx/src/glimports.h b/3rdparty/bgfx/src/glimports.h index 7e110f06928..a12acb19d50 100644 --- a/3rdparty/bgfx/src/glimports.h +++ b/3rdparty/bgfx/src/glimports.h @@ -487,6 +487,7 @@ GL_IMPORT_OES__(true, PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC, glCompressedT GL_IMPORT_EXT__(true, PFNGLTEXSTORAGE2DPROC, glTexStorage2D); GL_IMPORT_EXT__(true, PFNGLTEXSTORAGE3DPROC, glTexStorage3D); +GL_IMPORT______(true, PFNGLTEXIMAGE2DMULTISAMPLEPROC, glTexImage2DMultisample); GL_IMPORT_EXT__(true, PFNGLINSERTEVENTMARKEREXTPROC, glInsertEventMarker); GL_IMPORT_EXT__(true, PFNGLPUSHGROUPMARKEREXTPROC, glPushGroupMarker); @@ -567,6 +568,7 @@ GL_IMPORT______(true, PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC, glCompressedT GL_IMPORT______(true, PFNGLTEXSTORAGE2DPROC, glTexStorage2D); GL_IMPORT______(true, PFNGLTEXSTORAGE3DPROC, glTexStorage3D); +GL_IMPORT______(true, PFNGLTEXIMAGE2DMULTISAMPLEPROC, glTexImage2DMultisample); GL_IMPORT______(true, PFNGLINSERTEVENTMARKEREXTPROC, glInsertEventMarker); GL_IMPORT______(true, PFNGLPUSHGROUPMARKEREXTPROC, glPushGroupMarker); diff --git a/3rdparty/bgfx/src/hmd_openvr.cpp b/3rdparty/bgfx/src/hmd_openvr.cpp index 8e873032154..9e360cbf18e 100644 --- a/3rdparty/bgfx/src/hmd_openvr.cpp +++ b/3rdparty/bgfx/src/hmd_openvr.cpp @@ -60,14 +60,14 @@ namespace bgfx VR_GetVRInitErrorAsEnglishDescription = (PFN_VR_GETVRINITERRORASENGLISHDESCRIPTION)bx::dlsym(openvrdll, "VR_GetVRInitErrorAsEnglishDescription"); if (NULL == VR_InitInternal - && NULL == VR_ShutdownInternal - && NULL == VR_IsHmdPresent - && NULL == VR_GetGenericInterface - && NULL == VR_IsRuntimeInstalled - && NULL == VR_IsInterfaceVersionValid - && NULL == VR_GetInitToken - && NULL == VR_GetVRInitErrorAsSymbol - && NULL == VR_GetVRInitErrorAsEnglishDescription) + || NULL == VR_ShutdownInternal + || NULL == VR_IsHmdPresent + || NULL == VR_GetGenericInterface + || NULL == VR_IsRuntimeInstalled + || NULL == VR_IsInterfaceVersionValid + || NULL == VR_GetInitToken + || NULL == VR_GetVRInitErrorAsSymbol + || NULL == VR_GetVRInitErrorAsEnglishDescription) { bx::dlclose(openvrdll); return NULL; diff --git a/3rdparty/bgfx/src/hmd_ovr.cpp b/3rdparty/bgfx/src/hmd_ovr.cpp index 7d3109dbd45..c63f9d90c6d 100644 --- a/3rdparty/bgfx/src/hmd_ovr.cpp +++ b/3rdparty/bgfx/src/hmd_ovr.cpp @@ -248,9 +248,9 @@ namespace bgfx } } - eye.viewOffset[0] = erd.HmdToEyeOffset.x; - eye.viewOffset[1] = erd.HmdToEyeOffset.y; - eye.viewOffset[2] = erd.HmdToEyeOffset.z; + eye.viewOffset[0] = -erd.HmdToEyeOffset.x; + eye.viewOffset[1] = -erd.HmdToEyeOffset.y; + eye.viewOffset[2] = -erd.HmdToEyeOffset.z; eye.pixelsPerTanAngle[0] = erd.PixelsPerTanAngleAtCenter.x; eye.pixelsPerTanAngle[1] = erd.PixelsPerTanAngleAtCenter.y; diff --git a/3rdparty/bgfx/src/renderer_d3d11.cpp b/3rdparty/bgfx/src/renderer_d3d11.cpp index 140f6a344c1..e226a9e3a9b 100644 --- a/3rdparty/bgfx/src/renderer_d3d11.cpp +++ b/3rdparty/bgfx/src/renderer_d3d11.cpp @@ -936,7 +936,7 @@ namespace bgfx { namespace d3d11 ; hr = E_FAIL; - for (uint32_t ii = 0; ii < 3 && FAILED(hr);) + for (uint32_t ii = 0; ii < BX_COUNTOF(featureLevel) && FAILED(hr);) { hr = D3D11CreateDevice(m_adapter , m_driverType @@ -995,9 +995,11 @@ namespace bgfx { namespace d3d11 if (NULL == m_deviceCtx) { - BX_TRACE("Unable to create Direct3D11 device."); + BX_TRACE("Unable to retrieve Direct3D11 ImmediateContext."); goto error; } + + m_featureLevel = m_device->GetFeatureLevel(); } { @@ -2408,7 +2410,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); } #if !BX_PLATFORM_WINDOWS - HRESULT hr; + HRESULT hr = S_OK; if (g_platformData.ndt == 0) { hr = m_factory->CreateSwapChainForCoreWindow(m_device @@ -3076,14 +3078,20 @@ BX_PRAGMA_DIAGNOSTIC_POP(); ID3D11ShaderResourceView* srv; if (NULL == ptr) { - TextureD3D11& texture = m_textures[_handle.idx]; + const TextureD3D11& texture = m_textures[_handle.idx]; + const bool msaaSample = 0 != (texture.m_flags&BGFX_TEXTURE_MSAA_SAMPLE); + const uint32_t msaaQuality = bx::uint32_satsub( (texture.m_flags&BGFX_TEXTURE_RT_MSAA_MASK)>>BGFX_TEXTURE_RT_MSAA_SHIFT, 1); + const DXGI_SAMPLE_DESC& msaa = s_msaa[msaaQuality]; D3D11_SHADER_RESOURCE_VIEW_DESC desc; desc.Format = s_textureFormat[texture.m_textureFormat].m_fmtSrv; switch (texture.m_type) { case TextureD3D11::Texture2D: - desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + desc.ViewDimension = 1 < msaa.Count && msaaSample + ? D3D11_SRV_DIMENSION_TEXTURE2DMS + : D3D11_SRV_DIMENSION_TEXTURE2D + ; desc.Texture2D.MostDetailedMip = _mip; desc.Texture2D.MipLevels = 1; break; @@ -3762,6 +3770,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); m_mirrorTextureDesc.Height = _height; ovrResult result = ovr_CreateMirrorTextureDX(_session, s_renderD3D11->m_device, &m_mirrorTextureDesc, &m_mirrorTexture); BX_WARN(OVR_SUCCESS(result), "Could not create D3D11 OVR mirror texture"); + BX_UNUSED(result); } void OVRMirrorD3D11::destroy(const ovrSession& session) @@ -4324,6 +4333,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); const bool srgb = 0 != (m_flags&BGFX_TEXTURE_SRGB) || imageContainer.m_srgb; const bool blit = 0 != (m_flags&BGFX_TEXTURE_BLIT_DST); const bool readBack = 0 != (m_flags&BGFX_TEXTURE_READ_BACK); + const bool msaaSample = 0 != (m_flags&BGFX_TEXTURE_MSAA_SAMPLE); const uint32_t msaaQuality = bx::uint32_satsub( (m_flags&BGFX_TEXTURE_RT_MSAA_MASK)>>BGFX_TEXTURE_RT_MSAA_SHIFT, 1); const DXGI_SAMPLE_DESC& msaa = s_msaa[msaaQuality]; @@ -4400,8 +4410,16 @@ BX_PRAGMA_DIAGNOSTIC_POP(); { desc.ArraySize = 1; desc.MiscFlags = 0; - srvd.ViewDimension = 1 < msaa.Count ? D3D11_SRV_DIMENSION_TEXTURE2DMS : D3D11_SRV_DIMENSION_TEXTURE2D; - srvd.Texture2D.MipLevels = numMips; + if (1 < msaa.Count + && msaaSample) + { + srvd.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DMS; + } + else + { + srvd.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + srvd.Texture2D.MipLevels = numMips; + } } DX_CHECK(s_renderD3D11->m_device->CreateTexture2D(&desc, kk == 0 ? NULL : srd, &m_texture2d) ); @@ -4675,7 +4693,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); } } - const uint32_t msaaQuality = bx::uint32_satsub( (texture.m_flags&BGFX_TEXTURE_RT_MSAA_MASK)>>BGFX_TEXTURE_RT_MSAA_SHIFT, 1); + const uint32_t msaaQuality = bx::uint32_satsub( (texture.m_flags&BGFX_TEXTURE_RT_MSAA_MASK)>>BGFX_TEXTURE_RT_MSAA_SHIFT, 1); const DXGI_SAMPLE_DESC& msaa = s_msaa[msaaQuality]; if (isDepth( (TextureFormat::Enum)texture.m_textureFormat) ) diff --git a/3rdparty/bgfx/src/renderer_d3d12.cpp b/3rdparty/bgfx/src/renderer_d3d12.cpp index 9cb4f1915d0..b94303eb952 100644 --- a/3rdparty/bgfx/src/renderer_d3d12.cpp +++ b/3rdparty/bgfx/src/renderer_d3d12.cpp @@ -352,6 +352,7 @@ namespace bgfx { namespace d3d12 _commandList->ResourceBarrier(1, &barrier); } +#if USE_D3D12_DYNAMIC_LIB static const GUID IID_ID3D12CommandAllocator = { 0x6102dee4, 0xaf59, 0x4b09, { 0xb9, 0x99, 0xb4, 0x4d, 0x73, 0xf0, 0x9b, 0x24 } }; static const GUID IID_ID3D12CommandQueue = { 0x0ec870a6, 0x5d7e, 0x4c22, { 0x8c, 0xfc, 0x5b, 0xaa, 0xe0, 0x76, 0x16, 0xed } }; static const GUID IID_ID3D12CommandSignature = { 0xc36a797c, 0xec80, 0x4f0a, { 0x89, 0x85, 0xa7, 0xb2, 0x47, 0x50, 0x82, 0xd1 } }; @@ -366,6 +367,7 @@ namespace bgfx { namespace d3d12 static const GUID IID_ID3D12RootSignature = { 0xc54a6b66, 0x72df, 0x4ee8, { 0x8b, 0xe5, 0xa9, 0x46, 0xa1, 0x42, 0x92, 0x14 } }; static const GUID IID_ID3D12QueryHeap = { 0x0d9658ae, 0xed45, 0x469e, { 0xa6, 0x1d, 0x97, 0x0e, 0xc5, 0x83, 0xca, 0xb4 } }; static const GUID IID_IDXGIFactory4 = { 0x1bc6ea02, 0xef36, 0x464f, { 0xbf, 0x0c, 0x21, 0xca, 0x39, 0xe5, 0x16, 0x8a } }; +#endif // USE_D3D12_DYNAMIC_LIB struct HeapProperty { @@ -578,6 +580,7 @@ namespace bgfx { namespace d3d12 m_adapter = NULL; m_driverType = D3D_DRIVER_TYPE_HARDWARE; + if (NULL != m_factory) { #if BX_PLATFORM_WINDOWS IDXGIAdapter3* adapter; @@ -674,6 +677,7 @@ namespace bgfx { namespace d3d12 goto error; } + if (NULL != m_factory) { memset(&m_adapterDesc, 0, sizeof(m_adapterDesc) ); luid = m_device->GetAdapterLuid(); @@ -726,6 +730,36 @@ namespace bgfx { namespace d3d12 } } +#if !BX_PLATFORM_WINDOWS + if (NULL == m_factory) + { + IDXGIDevice1* dxgiDevice; + hr = m_device->QueryInterface(IID_IDXGIDevice1, (void**)&dxgiDevice); + + if (FAILED(hr) ) + { + BX_TRACE("Unable to query IDXGIDevice1 interface 0x%08x.", hr); + goto error; + } + + hr = dxgiDevice->GetAdapter(&m_adapter); + + if (FAILED(hr) ) + { + BX_TRACE("DXGIDevice1::GetAdapter failed 0x%08x.", hr); + goto error; + } + + hr = m_adapter->GetParent(IID_IDXGIFactory2, (void**)&m_factory); + + if (FAILED(hr) ) + { + BX_TRACE("IDXGIAdapter::GetParent failed 0x%08x.", hr); + goto error; + } + } +#endif // !BX_PLATFORM_WINDOWS + DX_CHECK(m_device->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS, &m_options, sizeof(m_options) ) ); BX_TRACE("D3D12 options:") BX_TRACE("\tTiledResourcesTier %d", m_options.TiledResourcesTier); @@ -738,34 +772,96 @@ namespace bgfx { namespace d3d12 m_cmd.init(m_device); errorState = ErrorState::CreatedCommandQueue; - m_scd.BufferDesc.Width = BGFX_DEFAULT_WIDTH; - m_scd.BufferDesc.Height = BGFX_DEFAULT_HEIGHT; - m_scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; - m_scd.BufferDesc.Scaling = DXGI_MODE_SCALING_STRETCHED; - m_scd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED; - m_scd.BufferDesc.RefreshRate.Numerator = 60; - m_scd.BufferDesc.RefreshRate.Denominator = 1; - m_scd.SampleDesc.Count = 1; - m_scd.SampleDesc.Quality = 0; - m_scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; - m_scd.BufferCount = bx::uint32_min(BX_COUNTOF(m_backBufferColor), 4); - m_scd.OutputWindow = (HWND)g_platformData.nwh; - m_scd.Windowed = true; - m_scd.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; - m_scd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; - - BX_CHECK(m_scd.BufferCount <= BX_COUNTOF(m_backBufferColor), "Swap chain buffer count %d (max %d)." - , m_scd.BufferCount - , BX_COUNTOF(m_backBufferColor) - ); - hr = m_factory->CreateSwapChain(m_cmd.m_commandQueue - , &m_scd - , reinterpret_cast(&m_swapChain) - ); - BX_WARN(SUCCEEDED(hr), "Failed to create swap chain."); - if (FAILED(hr) ) + if (NULL == g_platformData.backBuffer) { - goto error; +#if !BX_PLATFORM_WINDOWS + hr = m_adapter->GetParent(__uuidof(IDXGIFactory2), (void**)&m_factory); + DX_RELEASE(m_adapter, 1); + if (FAILED(hr) ) + { + BX_TRACE("Unable to create Direct3D11 device."); + goto error; + } + + m_scd.Width = BGFX_DEFAULT_WIDTH; + m_scd.Height = BGFX_DEFAULT_HEIGHT; + m_scd.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + m_scd.Stereo = false; + m_scd.SampleDesc.Count = 1; + m_scd.SampleDesc.Quality = 0; + m_scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; + m_scd.BufferCount = bx::uint32_min(BX_COUNTOF(m_backBufferColor), 4); + m_scd.Scaling = DXGI_SCALING_STRETCH; + m_scd.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; + m_scd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; + + if (NULL == g_platformData.ndt) + { + hr = m_factory->CreateSwapChainForCoreWindow(m_device + , (::IUnknown*)g_platformData.nwh + , &m_scd + , NULL + , &m_swapChain + ); + BGFX_FATAL(SUCCEEDED(hr), Fatal::UnableToInitialize, "Unable to create Direct3D11 swap chain."); + } + else + { + BGFX_FATAL(g_platformData.ndt == reinterpret_cast(1), Fatal::UnableToInitialize, "Unable to set swap chain on panel."); + + hr = m_factory->CreateSwapChainForComposition(m_device + , &m_scd + , NULL + , &m_swapChain + ); + BX_WARN(SUCCEEDED(hr), "Unable to create Direct3D11 swap chain."); + +# if BX_PLATFORM_WINRT + IInspectable* nativeWindow = reinterpret_cast(g_platformData.nwh); + ISwapChainBackgroundPanelNative* panel = NULL; + hr = nativeWindow->QueryInterface(__uuidof(ISwapChainBackgroundPanelNative), (void**)&panel); + BGFX_FATAL(SUCCEEDED(hr), Fatal::UnableToInitialize, "Unable to set swap chain on panel."); + + if (NULL != panel) + { + hr = panel->SetSwapChain(m_swapChain); + BGFX_FATAL(SUCCEEDED(hr), Fatal::UnableToInitialize, "Unable to set swap chain on panel."); + + panel->Release(); + } +# endif // BX_PLATFORM_WINRT + } +#else + m_scd.BufferDesc.Width = BGFX_DEFAULT_WIDTH; + m_scd.BufferDesc.Height = BGFX_DEFAULT_HEIGHT; + m_scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + m_scd.BufferDesc.Scaling = DXGI_MODE_SCALING_STRETCHED; + m_scd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED; + m_scd.BufferDesc.RefreshRate.Numerator = 60; + m_scd.BufferDesc.RefreshRate.Denominator = 1; + m_scd.SampleDesc.Count = 1; + m_scd.SampleDesc.Quality = 0; + m_scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; + m_scd.BufferCount = bx::uint32_min(BX_COUNTOF(m_backBufferColor), 4); + m_scd.OutputWindow = (HWND)g_platformData.nwh; + m_scd.Windowed = true; + m_scd.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; + m_scd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; + + BX_CHECK(m_scd.BufferCount <= BX_COUNTOF(m_backBufferColor), "Swap chain buffer count %d (max %d)." + , m_scd.BufferCount + , BX_COUNTOF(m_backBufferColor) + ); + hr = m_factory->CreateSwapChain(m_cmd.m_commandQueue + , &m_scd + , reinterpret_cast(&m_swapChain) + ); +#endif // BX_PLATFORM_* + if (FAILED(hr) ) + { + BX_TRACE("Failed to create swap chain."); + goto error; + } } m_presentElapsed = 0; @@ -1537,8 +1633,8 @@ namespace bgfx { namespace d3d12 void blitSetup(TextVideoMemBlitter& _blitter) BX_OVERRIDE { - const uint32_t width = m_scd.BufferDesc.Width; - const uint32_t height = m_scd.BufferDesc.Height; + const uint32_t width = getBufferWidth(); + const uint32_t height = getBufferHeight(); FrameBufferHandle fbh = BGFX_INVALID_HANDLE; setFrameBuffer(fbh, false); @@ -1732,7 +1828,7 @@ namespace bgfx { namespace d3d12 D3D12_FEATURE_DATA_MULTISAMPLE_QUALITY_LEVELS data; memset(&data, 0, sizeof(msaa) ); - data.Format = m_scd.BufferDesc.Format; + data.Format = getBufferFormat(); data.SampleCount = msaa; data.Flags = D3D12_MULTISAMPLE_QUALITY_LEVELS_FLAG_NONE; HRESULT hr = m_device->CheckFeatureSupport(D3D12_FEATURE_MULTISAMPLE_QUALITY_LEVELS, &data, sizeof(data) ); @@ -1793,8 +1889,7 @@ data.NumQualityLevels = 0; m_textVideoMem.resize(false, _resolution.m_width, _resolution.m_height); m_textVideoMem.clear(); - m_scd.BufferDesc.Width = _resolution.m_width; - m_scd.BufferDesc.Height = _resolution.m_height; + setBufferSize(_resolution.m_width, _resolution.m_height); preReset(); @@ -1824,12 +1919,14 @@ data.NumQualityLevels = 0; DX_RELEASE(m_swapChain, 0); +#if BX_PLATFORM_WINDOWS HRESULT hr; hr = m_factory->CreateSwapChain(m_cmd.m_commandQueue , &m_scd , reinterpret_cast(&m_swapChain) ); BGFX_FATAL(SUCCEEDED(hr), bgfx::Fatal::UnableToInitialize, "Failed to create swap chain."); +#endif // BX_PLATFORM_WINDOWS } postReset(); @@ -2462,6 +2559,44 @@ data.NumQualityLevels = 0; return _visible == (0 != _render->m_occlusion[_handle.idx]); } + DXGI_FORMAT getBufferFormat() + { +#if BX_PLATFORM_WINDOWS + return m_scd.BufferDesc.Format; +#else + return m_scd.Format; +#endif + } + + uint32_t getBufferWidth() + { +#if BX_PLATFORM_WINDOWS + return m_scd.BufferDesc.Width; +#else + return m_scd.Width; +#endif + } + + uint32_t getBufferHeight() + { +#if BX_PLATFORM_WINDOWS + return m_scd.BufferDesc.Height; +#else + return m_scd.Height; +#endif + } + + void setBufferSize(uint32_t _width, uint32_t _height) + { +#if BX_PLATFORM_WINDOWS + m_scd.BufferDesc.Width = _width; + m_scd.BufferDesc.Height = _height; +#else + m_scd.Width = _width; + m_scd.Height = _height; +#endif + } + void commit(UniformBuffer& _uniformBuffer) { _uniformBuffer.reset(); @@ -2614,8 +2749,8 @@ data.NumQualityLevels = 0; } else { - width = m_scd.BufferDesc.Width; - height = m_scd.BufferDesc.Height; + width = getBufferWidth(); + height = getBufferHeight(); } if (0 == _rect.m_x @@ -2711,7 +2846,11 @@ data.NumQualityLevels = 0; Resolution m_resolution; bool m_wireframe; +#if BX_PLATFORM_WINDOWS DXGI_SWAP_CHAIN_DESC m_scd; +#else + DXGI_SWAP_CHAIN_DESC1 m_scd; +#endif // BX_PLATFORM_WINDOWS uint32_t m_maxAnisotropy; bool m_depthClamp; @@ -3539,7 +3678,7 @@ data.NumQualityLevels = 0; DXGI_FORMAT format; uint32_t stride; - D3D12_RESOURCE_FLAGS flags = needUav + uint32_t flags = needUav ? D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS : D3D12_RESOURCE_FLAG_NONE ; @@ -3602,7 +3741,7 @@ data.NumQualityLevels = 0; ID3D12Device* device = s_renderD3D12->m_device; ID3D12GraphicsCommandList* commandList = s_renderD3D12->m_commandList; - m_ptr = createCommittedResource(device, HeapProperty::Default, _size, flags); + m_ptr = createCommittedResource(device, HeapProperty::Default, _size, D3D12_RESOURCE_FLAGS(flags) ); m_gpuVA = m_ptr->GetGPUVirtualAddress(); setState(commandList, drawIndirect ? D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT diff --git a/3rdparty/bgfx/src/renderer_gl.cpp b/3rdparty/bgfx/src/renderer_gl.cpp index 10f5a1c3fd9..d560f65d926 100644 --- a/3rdparty/bgfx/src/renderer_gl.cpp +++ b/3rdparty/bgfx/src/renderer_gl.cpp @@ -918,6 +918,23 @@ namespace bgfx { namespace gl NULL }; + static const char* s_ARB_gpu_shader5[] = + { + "bitfieldReverse", + "floatBitsToInt", + "floatBitsToUint", + "intBitsToFloat", + "uintBitsToFloat", + NULL + }; + + static const char* s_ARB_shading_language_packing[] = + { + "packHalf2x16", + "unpackHalf2x16", + NULL + }; + static void GL_APIENTRY stubVertexAttribDivisor(GLuint /*_index*/, GLuint /*_divisor*/) { } @@ -3410,7 +3427,6 @@ namespace bgfx { namespace gl GL_CHECK(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT) ); GL_CHECK(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR) ); GL_CHECK(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) ); - GL_CHECK(glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MAX_LEVEL, 0) ); } } @@ -3580,6 +3596,10 @@ namespace bgfx { namespace gl GLSL_TYPE(GL_INT_SAMPLER_CUBE); GLSL_TYPE(GL_UNSIGNED_INT_SAMPLER_CUBE); + GLSL_TYPE(GL_SAMPLER_2D_MULTISAMPLE); + GLSL_TYPE(GL_INT_SAMPLER_2D_MULTISAMPLE); + GLSL_TYPE(GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE); + GLSL_TYPE(GL_SAMPLER_2D_SHADOW); GLSL_TYPE(GL_IMAGE_1D); @@ -3670,6 +3690,10 @@ namespace bgfx { namespace gl case GL_SAMPLER_2D_SHADOW: + case GL_SAMPLER_2D_MULTISAMPLE: + case GL_INT_SAMPLER_2D_MULTISAMPLE: + case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE: + case GL_IMAGE_1D: case GL_INT_IMAGE_1D: case GL_UNSIGNED_INT_IMAGE_1D: @@ -3779,6 +3803,8 @@ namespace bgfx { namespace gl GL_CHECK(glBindFragDataLocation(m_id, 0, "bgfx_FragColor") ); #endif // BGFX_CONFIG_RENDERER_OPENGL >= 31 + GLint max0, max1; + bool piqSupported = true && s_extension[Extension::ARB_program_interface_query ].m_supported && s_extension[Extension::ARB_shader_storage_buffer_object].m_supported @@ -3789,16 +3815,18 @@ namespace bgfx { namespace gl GL_CHECK(glGetProgramInterfaceiv(m_id, GL_PROGRAM_INPUT, GL_ACTIVE_RESOURCES, &activeAttribs ) ); GL_CHECK(glGetProgramInterfaceiv(m_id, GL_UNIFORM, GL_ACTIVE_RESOURCES, &activeUniforms) ); GL_CHECK(glGetProgramInterfaceiv(m_id, GL_BUFFER_VARIABLE, GL_ACTIVE_RESOURCES, &activeBuffers ) ); + GL_CHECK(glGetProgramInterfaceiv(m_id, GL_PROGRAM_INPUT, GL_MAX_NAME_LENGTH, &max0 ) ); + GL_CHECK(glGetProgramInterfaceiv(m_id, GL_UNIFORM, GL_MAX_NAME_LENGTH, &max1 ) ); } else { GL_CHECK(glGetProgramiv(m_id, GL_ACTIVE_ATTRIBUTES, &activeAttribs ) ); GL_CHECK(glGetProgramiv(m_id, GL_ACTIVE_UNIFORMS, &activeUniforms) ); + + GL_CHECK(glGetProgramiv(m_id, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &max0) ); + GL_CHECK(glGetProgramiv(m_id, GL_ACTIVE_UNIFORM_MAX_LENGTH, &max1) ); } - GLint max0, max1; - GL_CHECK(glGetProgramiv(m_id, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &max0) ); - GL_CHECK(glGetProgramiv(m_id, GL_ACTIVE_UNIFORM_MAX_LENGTH, &max1) ); uint32_t maxLength = bx::uint32_max(max0, max1); char* name = (char*)alloca(maxLength + 1); @@ -3807,9 +3835,26 @@ namespace bgfx { namespace gl for (int32_t ii = 0; ii < activeAttribs; ++ii) { GLint size; - GLenum type; + GLenum type = 0; - GL_CHECK(glGetActiveAttrib(m_id, ii, maxLength + 1, NULL, &size, &type, name) ); + if (piqSupported) + { + GL_CHECK(glGetProgramResourceName(m_id, GL_PROGRAM_INPUT, ii, maxLength + 1, &size, name) ); + GLenum typeProp[] = { GL_TYPE }; + GL_CHECK(glGetProgramResourceiv(m_id + , GL_PROGRAM_INPUT + , ii + , BX_COUNTOF(typeProp) + , typeProp + , 1 + , NULL + , (GLint *)&type) + ); + } + else + { + GL_CHECK(glGetActiveAttrib(m_id, ii, maxLength + 1, NULL, &size, &type, name) ); + } BX_TRACE("\t%s %s is at location %d" , glslTypeName(type) @@ -4130,17 +4175,22 @@ namespace bgfx { namespace gl m_vcref.invalidate(s_renderGL->m_vaoStateCache); } - static void texImage(GLenum _target, GLint _level, GLint _internalFormat, GLsizei _width, GLsizei _height, GLsizei _depth, GLint _border, GLenum _format, GLenum _type, const GLvoid* _data) + static void texImage(GLenum _target, uint32_t _msaaQuality, GLint _level, GLint _internalFormat, GLsizei _width, GLsizei _height, GLsizei _depth, GLint _border, GLenum _format, GLenum _type, const GLvoid* _data) { if (_target == GL_TEXTURE_3D) { GL_CHECK(glTexImage3D(_target, _level, _internalFormat, _width, _height, _depth, _border, _format, _type, _data) ); } + else if (_target == GL_TEXTURE_2D_MULTISAMPLE) + { + GL_CHECK(glTexImage2DMultisample(_target, _msaaQuality, _internalFormat, _width, _height, false) ); + } else { - BX_UNUSED(_depth); GL_CHECK(glTexImage2D(_target, _level, _internalFormat, _width, _height, _border, _format, _type, _data) ); } + + BX_UNUSED(_msaaQuality, _depth, _border, _data); } static void texSubImage(GLenum _target, GLint _level, GLint _xoffset, GLint _yoffset, GLint _zoffset, GLsizei _width, GLsizei _height, GLsizei _depth, GLenum _format, GLenum _type, const GLvoid* _data) @@ -4327,7 +4377,14 @@ namespace bgfx { namespace gl m_requestedFormat = uint8_t(imageContainer.m_format); m_textureFormat = uint8_t(getViableTextureFormat(imageContainer) ); - GLenum target = GL_TEXTURE_2D; + const bool computeWrite = 0 != (_flags&BGFX_TEXTURE_COMPUTE_WRITE); + const bool srgb = 0 != (_flags&BGFX_TEXTURE_SRGB); + const bool msaaSample = 0 != (_flags&BGFX_TEXTURE_MSAA_SAMPLE); + uint32_t msaaQuality = ( (_flags&BGFX_TEXTURE_RT_MSAA_MASK)>>BGFX_TEXTURE_RT_MSAA_SHIFT); + msaaQuality = bx::uint32_satsub(msaaQuality, 1); + msaaQuality = bx::uint32_min(s_renderGL->m_maxMsaa, msaaQuality == 0 ? 0 : 1<>BGFX_TEXTURE_U_SHIFT]) ); GL_CHECK(glTexParameteri(target, GL_TEXTURE_WRAP_T, s_textureAddress[(flags&BGFX_TEXTURE_V_MASK)>>BGFX_TEXTURE_V_SHIFT]) ); @@ -4680,7 +4737,7 @@ namespace bgfx { namespace gl if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL || BGFX_CONFIG_RENDERER_OPENGLES >= 30) || s_extension[Extension::APPLE_texture_max_level].m_supported) { - GL_CHECK(glTexParameteri(target, GL_TEXTURE_MAX_LEVEL, numMips-1) ); + GL_CHECK(glTexParameteri(targetMsaa, GL_TEXTURE_MAX_LEVEL, numMips-1) ); } if (target == GL_TEXTURE_3D) @@ -4715,12 +4772,12 @@ namespace bgfx { namespace gl const uint32_t cmpFunc = (flags&BGFX_TEXTURE_COMPARE_MASK)>>BGFX_TEXTURE_COMPARE_SHIFT; if (0 == cmpFunc) { - GL_CHECK(glTexParameteri(m_target, GL_TEXTURE_COMPARE_MODE, GL_NONE) ); + GL_CHECK(glTexParameteri(target, GL_TEXTURE_COMPARE_MODE, GL_NONE) ); } else { - GL_CHECK(glTexParameteri(m_target, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE) ); - GL_CHECK(glTexParameteri(m_target, GL_TEXTURE_COMPARE_FUNC, s_cmpFunc[cmpFunc]) ); + GL_CHECK(glTexParameteri(target, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE) ); + GL_CHECK(glTexParameteri(target, GL_TEXTURE_COMPARE_FUNC, s_cmpFunc[cmpFunc]) ); } } @@ -5027,10 +5084,11 @@ namespace bgfx { namespace gl ; const bool usesIUsamplers = !!bx::findIdentifierMatch(code, s_uisamplers); const bool usesTexelFetch = !!bx::findIdentifierMatch(code, s_texelFetch); - const bool usesTextureMS = !!bx::findIdentifierMatch(code, s_ARB_texture_multisample); + const bool usesGpuShader5 = !!bx::findIdentifierMatch(code, s_ARB_gpu_shader5); + const bool usesPacking = !!bx::findIdentifierMatch(code, s_ARB_shading_language_packing); uint32_t version = - usesIUsamplers || usesTexelFetch || usesTextureMS ? 130 + usesIUsamplers || usesTexelFetch ? 130 : usesTextureLod ? 120 : 0 ; @@ -5048,9 +5106,14 @@ namespace bgfx { namespace gl } } - if (usesTextureMS) + if (usesGpuShader5) { - writeString(&writer, "#extension GL_ARB_texture_multisample : enable\n"); + writeString(&writer, "#extension GL_ARB_gpu_shader5 : enable\n"); + } + + if (usesPacking) + { + writeString(&writer, "#extension GL_ARB_shading_language_packing : enable\n"); } if (130 <= version) @@ -5090,6 +5153,18 @@ namespace bgfx { namespace gl writeString(&writer, "#define gl_FragColor bgfx_FragColor\n"); } } + else + { + if (m_type == GL_FRAGMENT_SHADER) + { + writeString(&writer, "#define in varying\n"); + } + else + { + writeString(&writer, "#define in attribute\n"); + writeString(&writer, "#define out varying\n"); + } + } writeString(&writer , "#define lowp\n" @@ -5168,6 +5243,11 @@ namespace bgfx { namespace gl } } + if (!!bx::findIdentifierMatch(code, s_ARB_texture_multisample)) + { + writeString(&writer, "#extension GL_ARB_texture_multisample : enable\n"); + } + if (0 != fragData) { writeStringf(&writer, "out vec4 bgfx_FragData[%d];\n", fragData); diff --git a/3rdparty/bgfx/src/renderer_gl.h b/3rdparty/bgfx/src/renderer_gl.h index 527910e559e..4e205fe3095 100644 --- a/3rdparty/bgfx/src/renderer_gl.h +++ b/3rdparty/bgfx/src/renderer_gl.h @@ -640,6 +640,18 @@ typedef uint64_t GLuint64; # define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 #endif // GL_UNSIGNED_INT_SAMPLER_CUBE +#ifndef GL_SAMPLER_2D_MULTISAMPLE +# define GL_SAMPLER_2D_MULTISAMPLE 0x9108 +#endif // GL_SAMPLER_2D_MULTISAMPLE + +#ifndef GL_INT_SAMPLER_2D_MULTISAMPLE +# define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 +#endif // GL_INT_SAMPLER_2D_MULTISAMPLE + +#ifndef GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE +# define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A +#endif // GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE + #ifndef GL_SAMPLER_2D_SHADOW # define GL_SAMPLER_2D_SHADOW 0x8B62 #endif // GL_SAMPLER_2D_SHADOW @@ -867,6 +879,10 @@ typedef uint64_t GLuint64; # define GL_DISPATCH_INDIRECT_BUFFER 0x90EE #endif // GL_DISPATCH_INDIRECT_BUFFER +#ifndef GL_MAX_NAME_LENGTH +# define GL_MAX_NAME_LENGTH 0x92F6 +#endif // GL_MAX_NAME_LENGTH + #if BX_PLATFORM_NACL # include "glcontext_ppapi.h" #elif BX_PLATFORM_WINDOWS diff --git a/3rdparty/bgfx/src/vertexdecl.cpp b/3rdparty/bgfx/src/vertexdecl.cpp index c5fb4b05dec..d3945cd3226 100644 --- a/3rdparty/bgfx/src/vertexdecl.cpp +++ b/3rdparty/bgfx/src/vertexdecl.cpp @@ -107,6 +107,7 @@ namespace bgfx murmur.begin(); murmur.add(m_attributes, sizeof(m_attributes) ); murmur.add(m_offset, sizeof(m_offset) ); + murmur.add(m_stride); m_hash = murmur.end(); } diff --git a/3rdparty/bgfx/tools/shaderc/shaderc.cpp b/3rdparty/bgfx/tools/shaderc/shaderc.cpp index a0f89e4f647..2376e492a1d 100644 --- a/3rdparty/bgfx/tools/shaderc/shaderc.cpp +++ b/3rdparty/bgfx/tools/shaderc/shaderc.cpp @@ -1653,6 +1653,16 @@ namespace bgfx preprocessor.writef( "\n#define __RETURN__ \\\n" "\t} \\\n" + ); + + if (hlsl <= 3) + { +// preprocessor.writef( +// "\tgl_Position.xy += u_viewTexel.xy * gl_Position.w; \\\n" +// ); + } + + preprocessor.writef( "\treturn _varying_" ); } diff --git a/3rdparty/bgfx/tools/texturec/texturec.cpp b/3rdparty/bgfx/tools/texturec/texturec.cpp index 21d256ffbbb..ba23a528339 100644 --- a/3rdparty/bgfx/tools/texturec/texturec.cpp +++ b/3rdparty/bgfx/tools/texturec/texturec.cpp @@ -19,6 +19,10 @@ #include #include +extern "C" { +#include +} + #define STB_IMAGE_IMPLEMENTATION #include @@ -348,6 +352,7 @@ void help(const char* _error = NULL) " -m, --mips Generate mip-maps.\n" " -n, --normalmap Input texture is normal map.\n" " --sdf Compute SDF texture.\n" + " --iqa Image Quality Assesment\n" "\n" "For additional information, see https://github.com/bkaradzic/bgfx\n" @@ -409,8 +414,9 @@ int main(int _argc, const char* _argv[]) } } - const bool mips = cmdLine.hasArg('m', "mips"); - const bool normalMap = cmdLine.hasArg('n', "normalmap"); + const bool mips = cmdLine.hasArg('m', "mips"); + const bool normalMap = cmdLine.hasArg('n', "normalmap"); + const bool iqa = cmdLine.hasArg('\0', "iqa"); uint32_t size = (uint32_t)bx::getSize(&reader); const bgfx::Memory* mem = bgfx::alloc(size); @@ -567,6 +573,13 @@ int main(int _argc, const char* _argv[]) , mip.m_format ); + void* ref = NULL; + if (iqa) + { + ref = BX_ALLOC(&allocator, size); + memcpy(ref, rgba, size); + } + imageEncodeFromRgba8(output->data, rgba, dstMip.m_width, dstMip.m_height, format); for (uint8_t lod = 1; lod < numMips; ++lod) @@ -576,6 +589,40 @@ int main(int _argc, const char* _argv[]) uint8_t* data = const_cast(dstMip.m_data); imageEncodeFromRgba8(data, rgba, dstMip.m_width, dstMip.m_height, format); } + + if (NULL != ref) + { + imageDecodeToRgba8(rgba + , output->data + , mip.m_width + , mip.m_height + , mip.m_width*mip.m_bpp/8 + , format + ); + + static const iqa_ssim_args args = + { + 0.39f, // alpha + 0.731f, // beta + 1.12f, // gamma + 187, // L + 0.025987f, // K1 + 0.0173f, // K2 + 1 // factor + }; + + float result = iqa_ssim( (uint8_t*)ref + , rgba + , mip.m_width + , mip.m_height + , mip.m_width*mip.m_bpp/8 + , 0 + , &args + ); + printf("%f\n", result); + + BX_FREE(&allocator, ref); + } } BX_FREE(&allocator, temp); diff --git a/3rdparty/bgfx/tools/texturev/fs_texture.bin.h b/3rdparty/bgfx/tools/texturev/fs_texture.bin.h new file mode 100644 index 00000000000..7cec18a68cf --- /dev/null +++ b/3rdparty/bgfx/tools/texturev/fs_texture.bin.h @@ -0,0 +1,127 @@ +static const uint8_t fs_texture_glsl[315] = +{ + 0x46, 0x53, 0x48, 0x04, 0x01, 0x83, 0xf2, 0xe1, 0x02, 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, // FSH........s_tex + 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x08, 0x75, 0x5f, 0x70, 0x61, // Color.......u_pa + 0x72, 0x61, 0x6d, 0x73, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x0c, 0x01, 0x00, 0x00, 0x76, 0x61, // rams..........va + 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // rying highp vec4 + 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, // v_color0;.varyi + 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, // ng highp vec2 v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, // texcoord0;.unifo + 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x73, 0x5f, 0x74, // rm sampler2D s_t + 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, // exColor;.uniform + 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, // highp vec4 u_pa + 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, // rams;.void main + 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, // ().{. lowp vec4 + 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, // tmpvar_1;. tmp + 0x76, 0x61, 0x72, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, // var_1 = texture2 + 0x44, 0x4c, 0x6f, 0x64, 0x20, 0x20, 0x20, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, // DLod (s_texCo + 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, // lor, v_texcoord0 + 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x20, // , u_params.x);. + 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, // gl_FragColor = + 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, // (tmpvar_1 * v_co + 0x6c, 0x6f, 0x72, 0x30, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // lor0);.}... +}; +static const uint8_t fs_texture_dx9[365] = +{ + 0x46, 0x53, 0x48, 0x04, 0x01, 0x83, 0xf2, 0xe1, 0x02, 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, // FSH........s_tex + 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x01, 0x00, 0x00, 0x01, 0x00, 0x08, 0x75, 0x5f, 0x70, 0x61, // Color0......u_pa + 0x72, 0x61, 0x6d, 0x73, 0x12, 0x01, 0x00, 0x00, 0x01, 0x00, 0x40, 0x01, 0x00, 0x03, 0xff, 0xff, // rams......@..... + 0xfe, 0xff, 0x2f, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, // ../.CTAB........ + 0x00, 0x03, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, // ................ + 0x7c, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, // |...D........... + 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, // P.......`....... + 0x01, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x5f, 0x74, 0x65, // ....l.......s_te + 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0xab, 0x04, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00, // xColor.......... + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, // ........u_params + 0x00, 0xab, 0xab, 0xab, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, // ................ + 0x00, 0x00, 0x00, 0x00, 0x70, 0x73, 0x5f, 0x33, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, // ....ps_3_0.Micro + 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, // soft (R) HLSL Sh + 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x31, 0x30, // ader Compiler 10 + 0x2e, 0x30, 0x2e, 0x31, 0x30, 0x30, 0x31, 0x31, 0x2e, 0x31, 0x36, 0x33, 0x38, 0x34, 0x00, 0xab, // .0.10011.16384.. + 0x51, 0x00, 0x00, 0x05, 0x01, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, // Q..........?.... + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x80, // ................ + 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x01, 0x00, 0x03, 0x90, // ................ + 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x90, 0x00, 0x08, 0x0f, 0xa0, 0x05, 0x00, 0x00, 0x03, // ................ + 0x00, 0x00, 0x07, 0x80, 0x01, 0x00, 0xd0, 0xa0, 0x01, 0x00, 0xc4, 0x90, 0x01, 0x00, 0x00, 0x02, // ................ + 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, 0xa0, 0x5f, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, // ........_....... + 0x00, 0x00, 0xe4, 0x80, 0x00, 0x08, 0xe4, 0xa0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x08, 0x0f, 0x80, // ................ + 0x00, 0x00, 0xe4, 0x80, 0x00, 0x00, 0xe4, 0x90, 0xff, 0xff, 0x00, 0x00, 0x00, // ............. +}; +static const uint8_t fs_texture_dx11[444] = +{ + 0x46, 0x53, 0x48, 0x04, 0x01, 0x83, 0xf2, 0xe1, 0x02, 0x00, 0x08, 0x75, 0x5f, 0x70, 0x61, 0x72, // FSH........u_par + 0x61, 0x6d, 0x73, 0x12, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, // ams.......s_texC + 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x01, 0x00, 0x00, 0x01, 0x00, 0x8c, 0x01, 0x44, 0x58, 0x42, 0x43, // olor0.......DXBC + 0xb9, 0x1c, 0x87, 0x4c, 0x82, 0x98, 0xc2, 0x74, 0x81, 0x9e, 0xa8, 0x24, 0xac, 0xbe, 0xee, 0x7b, // ...L...t...$...{ + 0x01, 0x00, 0x00, 0x00, 0x8c, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, // ............,... + 0xa0, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0x49, 0x53, 0x47, 0x4e, 0x6c, 0x00, 0x00, 0x00, // ........ISGNl... + 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........P....... + 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, // ................ + 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, // ................ + 0x01, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........b....... + 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, // ................ + 0x53, 0x56, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x00, 0x43, 0x4f, 0x4c, 0x4f, // SV_POSITION.COLO + 0x52, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0xab, 0x4f, 0x53, 0x47, 0x4e, // R.TEXCOORD..OSGN + 0x2c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, // ,........... ... + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................ + 0x0f, 0x00, 0x00, 0x00, 0x53, 0x56, 0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x00, 0xab, 0xab, // ....SV_TARGET... + 0x53, 0x48, 0x44, 0x52, 0xb0, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, // SHDR....@...,... + 0x59, 0x00, 0x00, 0x04, 0x46, 0x8e, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, // Y...F. ......... + 0x5a, 0x00, 0x00, 0x03, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x18, 0x00, 0x04, // Z....`......X... + 0x00, 0x70, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x62, 0x10, 0x00, 0x03, // .p......UU..b... + 0xf2, 0x10, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x62, 0x10, 0x00, 0x03, 0x32, 0x10, 0x10, 0x00, // ........b...2... + 0x02, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x03, 0xf2, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, // ....e.... ...... + 0x68, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x0c, 0xf2, 0x00, 0x10, 0x00, // h.......H....... + 0x00, 0x00, 0x00, 0x00, 0x46, 0x10, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x46, 0x7e, 0x10, 0x00, // ....F.......F~.. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x80, 0x20, 0x00, // .....`........ . + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x07, 0xf2, 0x20, 0x10, 0x00, // ........8.... .. + 0x00, 0x00, 0x00, 0x00, 0x46, 0x0e, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x1e, 0x10, 0x00, // ....F.......F... + 0x01, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, // ....>....... +}; +static const uint8_t fs_texture_mtl[699] = +{ + 0x46, 0x53, 0x48, 0x04, 0x01, 0x83, 0xf2, 0xe1, 0x00, 0x00, 0xac, 0x02, 0x00, 0x00, 0x75, 0x73, // FSH...........us + 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x6d, 0x65, // ing namespace me + 0x74, 0x61, 0x6c, 0x3b, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x78, 0x6c, 0x61, 0x74, // tal;.struct xlat + 0x4d, 0x74, 0x6c, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x7b, // MtlShaderInput { + 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // . float4 v_colo + 0x72, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x76, 0x5f, 0x74, // r0;. float2 v_t + 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x7d, 0x3b, 0x0a, 0x73, 0x74, 0x72, // excoord0;.};.str + 0x75, 0x63, 0x74, 0x20, 0x78, 0x6c, 0x61, 0x74, 0x4d, 0x74, 0x6c, 0x53, 0x68, 0x61, 0x64, 0x65, // uct xlatMtlShade + 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, // rOutput {. half + 0x34, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, // 4 gl_FragColor;. + 0x7d, 0x3b, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x78, 0x6c, 0x61, 0x74, 0x4d, 0x74, // };.struct xlatMt + 0x6c, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x7b, // lShaderUniform { + 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, // . float4 u_para + 0x6d, 0x73, 0x3b, 0x0a, 0x7d, 0x3b, 0x0a, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, // ms;.};.fragment + 0x78, 0x6c, 0x61, 0x74, 0x4d, 0x74, 0x6c, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x4f, 0x75, 0x74, // xlatMtlShaderOut + 0x70, 0x75, 0x74, 0x20, 0x78, 0x6c, 0x61, 0x74, 0x4d, 0x74, 0x6c, 0x4d, 0x61, 0x69, 0x6e, 0x20, // put xlatMtlMain + 0x28, 0x78, 0x6c, 0x61, 0x74, 0x4d, 0x74, 0x6c, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x49, 0x6e, // (xlatMtlShaderIn + 0x70, 0x75, 0x74, 0x20, 0x5f, 0x6d, 0x74, 0x6c, 0x5f, 0x69, 0x20, 0x5b, 0x5b, 0x73, 0x74, 0x61, // put _mtl_i [[sta + 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, // ge_in]], constan + 0x74, 0x20, 0x78, 0x6c, 0x61, 0x74, 0x4d, 0x74, 0x6c, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x55, // t xlatMtlShaderU + 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x26, 0x20, 0x5f, 0x6d, 0x74, 0x6c, 0x5f, 0x75, 0x20, 0x5b, // niform& _mtl_u [ + 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x0a, 0x20, 0x20, 0x2c, // [buffer(0)]]. , + 0x20, 0x20, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, // texture2d s_texColor [ + 0x5b, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x2c, 0x20, 0x73, // [texture(0)]], s + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x5f, 0x6d, 0x74, 0x6c, 0x73, 0x6d, 0x70, 0x5f, 0x73, // ampler _mtlsmp_s + 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x5b, 0x5b, 0x73, 0x61, 0x6d, 0x70, // _texColor [[samp + 0x6c, 0x65, 0x72, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x78, 0x6c, // ler(0)]]).{. xl + 0x61, 0x74, 0x4d, 0x74, 0x6c, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, // atMtlShaderOutpu + 0x74, 0x20, 0x5f, 0x6d, 0x74, 0x6c, 0x5f, 0x6f, 0x3b, 0x0a, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, // t _mtl_o;. half + 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, // 4 tmpvar_1;. tm + 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x73, // pvar_1 = half4(s + 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, // _texColor.sample + 0x28, 0x5f, 0x6d, 0x74, 0x6c, 0x73, 0x6d, 0x70, 0x5f, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, // (_mtlsmp_s_texCo + 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x29, 0x28, 0x5f, 0x6d, // lor, (float2)(_m + 0x74, 0x6c, 0x5f, 0x69, 0x2e, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, // tl_i.v_texcoord0 + 0x29, 0x2c, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x28, 0x5f, 0x6d, 0x74, 0x6c, 0x5f, 0x75, 0x2e, // ), level(_mtl_u. + 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x78, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, // u_params.x)));. + 0x20, 0x5f, 0x6d, 0x74, 0x6c, 0x5f, 0x6f, 0x2e, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, // _mtl_o.gl_FragC + 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x29, 0x28, // olor = ((half4)( + 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x29, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // (float4)tmpvar_1 + 0x20, 0x2a, 0x20, 0x5f, 0x6d, 0x74, 0x6c, 0x5f, 0x69, 0x2e, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // * _mtl_i.v_colo + 0x72, 0x30, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, // r0));. return _ + 0x6d, 0x74, 0x6c, 0x5f, 0x6f, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // mtl_o;.}... +}; diff --git a/3rdparty/bgfx/tools/texturev/fs_texture.sc b/3rdparty/bgfx/tools/texturev/fs_texture.sc new file mode 100644 index 00000000000..d1f69c0387e --- /dev/null +++ b/3rdparty/bgfx/tools/texturev/fs_texture.sc @@ -0,0 +1,19 @@ +$input v_texcoord0, v_color0 + +/* + * Copyright 2011-2016 Branimir Karadzic. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include + +SAMPLER2D(s_texColor, 0); + +uniform vec4 u_params; +#define u_textureLod u_params.x + +void main() +{ + vec4 color = texture2DLod(s_texColor, v_texcoord0, u_textureLod); + gl_FragColor = color * v_color0; +} diff --git a/3rdparty/bgfx/tools/texturev/fs_texture_cube.bin.h b/3rdparty/bgfx/tools/texturev/fs_texture_cube.bin.h new file mode 100644 index 00000000000..9b81cfc1b23 --- /dev/null +++ b/3rdparty/bgfx/tools/texturev/fs_texture_cube.bin.h @@ -0,0 +1,187 @@ +static const uint8_t fs_texture_cube_glsl[562] = +{ + 0x46, 0x53, 0x48, 0x04, 0x01, 0x83, 0xf2, 0xe1, 0x03, 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, // FSH........s_tex + 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x05, 0x75, 0x5f, 0x6d, 0x74, // Color.......u_mt + 0x78, 0x04, 0x01, 0x00, 0x00, 0x01, 0x00, 0x08, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, // x.......u_params + 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0xf7, 0x01, 0x00, 0x00, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, // ..........varyin + 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, // g highp vec4 v_c + 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, // olor0;.varying h + 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, // ighp vec2 v_texc + 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6c, // oord0;.uniform l + 0x6f, 0x77, 0x70, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x43, 0x75, 0x62, 0x65, 0x20, // owp samplerCube + 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, // s_texColor;.unif + 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, // orm highp mat4 u + 0x5f, 0x6d, 0x74, 0x78, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, // _mtx;.uniform hi + 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, // ghp vec4 u_param + 0x73, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, // s;.void main (). + 0x7b, 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x74, // {. highp vec3 t + 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // mpvar_1;. tmpva + 0x72, 0x5f, 0x31, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, // r_1.z = 1.0;. t + 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, // mpvar_1.xy = ((( + 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x2a, 0x20, 0x32, 0x2e, // v_texcoord0 * 2. + 0x30, 0x29, 0x20, 0x2d, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x32, // 0) - 1.0) * vec2 + 0x28, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, // (1.0, -1.0));. + 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // highp vec4 tmpva + 0x72, 0x5f, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, // r_2;. tmpvar_2. + 0x77, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // w = 0.0;. tmpva + 0x72, 0x5f, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // r_2.xyz = tmpvar + 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, // _1;. lowp vec4 + 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, // tmpvar_3;. tmpv + 0x61, 0x72, 0x5f, 0x33, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x43, 0x75, // ar_3 = textureCu + 0x62, 0x65, 0x4c, 0x6f, 0x64, 0x20, 0x20, 0x20, 0x20, 0x28, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, // beLod (s_texC + 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, // olor, normalize( + 0x28, 0x75, 0x5f, 0x6d, 0x74, 0x78, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // (u_mtx * tmpvar_ + 0x32, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x2c, 0x20, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, // 2).xyz), u_param + 0x73, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, // s.x);. gl_FragC + 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, // olor = (tmpvar_3 + 0x20, 0x2a, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, // * v_color0);.}. + 0x0a, 0x00, // .. +}; +static const uint8_t fs_texture_cube_dx9[505] = +{ + 0x46, 0x53, 0x48, 0x04, 0x01, 0x83, 0xf2, 0xe1, 0x03, 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, // FSH........s_tex + 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x01, 0x00, 0x00, 0x01, 0x00, 0x05, 0x75, 0x5f, 0x6d, 0x74, // Color0......u_mt + 0x78, 0x14, 0x01, 0x00, 0x00, 0x03, 0x00, 0x08, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, // x.......u_params + 0x12, 0x01, 0x03, 0x00, 0x01, 0x00, 0xc0, 0x01, 0x00, 0x03, 0xff, 0xff, 0xfe, 0xff, 0x3a, 0x00, // ..............:. + 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, 0x00, 0x00, 0xaf, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, // CTAB............ + 0x03, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, // ................ + 0x58, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x64, 0x00, 0x00, 0x00, // X...........d... + 0x00, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, // ....t........... + 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, // |............... + 0x01, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x5f, 0x74, 0x65, // ............s_te + 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0xab, 0x04, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x01, 0x00, // xColor.......... + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x5f, 0x6d, 0x74, 0x78, 0x00, 0xab, 0xab, // ........u_mtx... + 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................ + 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x00, 0xab, 0xab, 0xab, 0x01, 0x00, 0x03, 0x00, // u_params........ + 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x73, 0x5f, 0x33, // ............ps_3 + 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, // _0.Microsoft (R) + 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, // HLSL Shader Com + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x31, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x30, 0x30, 0x31, 0x31, // piler 10.0.10011 + 0x2e, 0x31, 0x36, 0x33, 0x38, 0x34, 0x00, 0xab, 0x51, 0x00, 0x00, 0x05, 0x04, 0x00, 0x0f, 0xa0, // .16384..Q....... + 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0xbf, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, // ...@.......?.... + 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, // ................ + 0x05, 0x00, 0x00, 0x80, 0x01, 0x00, 0x03, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x98, // ................ + 0x00, 0x08, 0x0f, 0xa0, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x80, 0x01, 0x00, 0xe4, 0x90, // ................ + 0x04, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x55, 0xa0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x80, // ......U......... + 0x00, 0x00, 0xe4, 0x80, 0x04, 0x00, 0xe6, 0xa0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0e, 0x80, // ................ + 0x00, 0x00, 0x55, 0x80, 0x01, 0x00, 0x90, 0xa0, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x80, // ..U............. + 0x00, 0x00, 0xe4, 0xa0, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xf9, 0x80, 0x02, 0x00, 0x00, 0x03, // ................ + 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x02, 0x00, 0xe4, 0xa0, 0x24, 0x00, 0x00, 0x02, // ............$... + 0x01, 0x00, 0x07, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x08, 0x80, // ................ + 0x03, 0x00, 0x00, 0xa0, 0x5f, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, 0x01, 0x00, 0xe4, 0x80, // ...._........... + 0x00, 0x08, 0xe4, 0xa0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x08, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0x80, // ................ + 0x00, 0x00, 0xe4, 0x90, 0xff, 0xff, 0x00, 0x00, 0x00, // ......... +}; +static const uint8_t fs_texture_cube_dx11[736] = +{ + 0x46, 0x53, 0x48, 0x04, 0x01, 0x83, 0xf2, 0xe1, 0x03, 0x00, 0x05, 0x75, 0x5f, 0x6d, 0x74, 0x78, // FSH........u_mtx + 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, // .......u_params. + 0x00, 0x40, 0x00, 0x01, 0x00, 0x0a, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // .@....s_texColor + 0x30, 0x01, 0x00, 0x00, 0x01, 0x00, 0xa4, 0x02, 0x44, 0x58, 0x42, 0x43, 0x4c, 0x24, 0x47, 0x2e, // 0.......DXBCL$G. + 0x14, 0x8a, 0x1d, 0xd0, 0x5e, 0x4b, 0xf7, 0x6a, 0x90, 0x00, 0xd7, 0x38, 0x01, 0x00, 0x00, 0x00, // ....^K.j...8.... + 0xa4, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, // ........,....... + 0xd4, 0x00, 0x00, 0x00, 0x49, 0x53, 0x47, 0x4e, 0x6c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, // ....ISGNl....... + 0x08, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, // ....P........... + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, // ................ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, // ................ + 0x0f, 0x0f, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ....b........... + 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x53, 0x56, 0x5f, 0x50, // ............SV_P + 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x00, 0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x00, 0x54, 0x45, // OSITION.COLOR.TE + 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0xab, 0x4f, 0x53, 0x47, 0x4e, 0x2c, 0x00, 0x00, 0x00, // XCOORD..OSGN,... + 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ ....... + 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, // ................ + 0x53, 0x56, 0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x00, 0xab, 0xab, 0x53, 0x48, 0x44, 0x52, // SV_TARGET...SHDR + 0xc8, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x04, // ....@...r...Y... + 0x46, 0x8e, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x03, // F. .........Z... + 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x30, 0x00, 0x04, 0x00, 0x70, 0x10, 0x00, // .`......X0...p.. + 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x62, 0x10, 0x00, 0x03, 0xf2, 0x10, 0x10, 0x00, // ....UU..b....... + 0x01, 0x00, 0x00, 0x00, 0x62, 0x10, 0x00, 0x03, 0x32, 0x10, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, // ....b...2....... + 0x65, 0x00, 0x00, 0x03, 0xf2, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x02, // e.... ......h... + 0x01, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x0f, 0x32, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, // ....2...2....... + 0x46, 0x10, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, // F........@.....@ + 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, // ...@.........@.. + 0x00, 0x00, 0x80, 0xbf, 0x00, 0x00, 0x80, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................ + 0x38, 0x00, 0x00, 0x0a, 0x32, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x10, 0x00, // 8...2.......F... + 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x80, 0xbf, // .....@.....?.... + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x08, 0xe2, 0x00, 0x10, 0x00, // ........8....... + 0x00, 0x00, 0x00, 0x00, 0x56, 0x05, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x89, 0x20, 0x00, // ....V......... . + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x0a, 0x72, 0x00, 0x10, 0x00, // ........2...r... + 0x00, 0x00, 0x00, 0x00, 0x46, 0x82, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ....F. ......... + 0x06, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x07, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, // ................ + 0x00, 0x00, 0x00, 0x08, 0x72, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x02, 0x10, 0x00, // ....r.......F... + 0x00, 0x00, 0x00, 0x00, 0x46, 0x82, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, // ....F. ......... + 0x10, 0x00, 0x00, 0x07, 0x82, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x02, 0x10, 0x00, // ............F... + 0x00, 0x00, 0x00, 0x00, 0x46, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x05, // ....F.......D... + 0x82, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, // ........:....... + 0x38, 0x00, 0x00, 0x07, 0x72, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0x0f, 0x10, 0x00, // 8...r........... + 0x00, 0x00, 0x00, 0x00, 0x46, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x0c, // ....F.......H... + 0xf2, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, // ........F....... + 0x46, 0x7e, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, // F~.......`...... + 0x0a, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x07, // .. .........8... + 0xf2, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0e, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, // . ......F....... + 0x46, 0x1e, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x00, 0x00, 0x50, 0x00, // F.......>.....P. +}; +static const uint8_t fs_texture_cube_mtl[962] = +{ + 0x46, 0x53, 0x48, 0x04, 0x01, 0x83, 0xf2, 0xe1, 0x00, 0x00, 0xb3, 0x03, 0x00, 0x00, 0x75, 0x73, // FSH...........us + 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x6d, 0x65, // ing namespace me + 0x74, 0x61, 0x6c, 0x3b, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x78, 0x6c, 0x61, 0x74, // tal;.struct xlat + 0x4d, 0x74, 0x6c, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x7b, // MtlShaderInput { + 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // . float4 v_colo + 0x72, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x76, 0x5f, 0x74, // r0;. float2 v_t + 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x7d, 0x3b, 0x0a, 0x73, 0x74, 0x72, // excoord0;.};.str + 0x75, 0x63, 0x74, 0x20, 0x78, 0x6c, 0x61, 0x74, 0x4d, 0x74, 0x6c, 0x53, 0x68, 0x61, 0x64, 0x65, // uct xlatMtlShade + 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, // rOutput {. half + 0x34, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, // 4 gl_FragColor;. + 0x7d, 0x3b, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x78, 0x6c, 0x61, 0x74, 0x4d, 0x74, // };.struct xlatMt + 0x6c, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x7b, // lShaderUniform { + 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x74, // . float4x4 u_mt + 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x70, 0x61, // x;. float4 u_pa + 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x0a, 0x7d, 0x3b, 0x0a, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, // rams;.};.fragmen + 0x74, 0x20, 0x78, 0x6c, 0x61, 0x74, 0x4d, 0x74, 0x6c, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x4f, // t xlatMtlShaderO + 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x78, 0x6c, 0x61, 0x74, 0x4d, 0x74, 0x6c, 0x4d, 0x61, 0x69, // utput xlatMtlMai + 0x6e, 0x20, 0x28, 0x78, 0x6c, 0x61, 0x74, 0x4d, 0x74, 0x6c, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, // n (xlatMtlShader + 0x49, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x5f, 0x6d, 0x74, 0x6c, 0x5f, 0x69, 0x20, 0x5b, 0x5b, 0x73, // Input _mtl_i [[s + 0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, // tage_in]], const + 0x61, 0x6e, 0x74, 0x20, 0x78, 0x6c, 0x61, 0x74, 0x4d, 0x74, 0x6c, 0x53, 0x68, 0x61, 0x64, 0x65, // ant xlatMtlShade + 0x72, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x26, 0x20, 0x5f, 0x6d, 0x74, 0x6c, 0x5f, 0x75, // rUniform& _mtl_u + 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x0a, 0x20, // [[buffer(0)]]. + 0x20, 0x2c, 0x20, 0x20, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x63, 0x75, 0x62, 0x65, // , texturecube + 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x20, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, // s_texCol + 0x6f, 0x72, 0x20, 0x5b, 0x5b, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x30, 0x29, 0x5d, // or [[texture(0)] + 0x5d, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x5f, 0x6d, 0x74, 0x6c, 0x73, // ], sampler _mtls + 0x6d, 0x70, 0x5f, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x5b, 0x5b, // mp_s_texColor [[ + 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x29, 0x0a, 0x7b, 0x0a, // sampler(0)]]).{. + 0x20, 0x20, 0x78, 0x6c, 0x61, 0x74, 0x4d, 0x74, 0x6c, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x4f, // xlatMtlShaderO + 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x5f, 0x6d, 0x74, 0x6c, 0x5f, 0x6f, 0x3b, 0x0a, 0x20, 0x20, // utput _mtl_o;. + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, // float3 tmpvar_1; + 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x7a, 0x20, 0x3d, 0x20, // . tmpvar_1.z = + 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, // 1.0;. tmpvar_1. + 0x78, 0x79, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x28, 0x5f, 0x6d, 0x74, 0x6c, 0x5f, 0x69, 0x2e, 0x76, // xy = (((_mtl_i.v + 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x2a, 0x20, 0x32, 0x2e, 0x30, // _texcoord0 * 2.0 + 0x29, 0x20, 0x2d, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, // ) - 1.0) * float + 0x32, 0x28, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x3b, 0x0a, 0x20, // 2(1.0, -1.0));. + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, // float4 tmpvar_2 + 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, 0x2e, 0x77, 0x20, 0x3d, // ;. tmpvar_2.w = + 0x20, 0x30, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x32, // 0.0;. tmpvar_2 + 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, // .xyz = tmpvar_1; + 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // . float3 tmpvar + 0x5f, 0x33, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x20, 0x3d, // _3;. tmpvar_3 = + 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x28, 0x5f, 0x6d, 0x74, 0x6c, // normalize((_mtl + 0x5f, 0x75, 0x2e, 0x75, 0x5f, 0x6d, 0x74, 0x78, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, // _u.u_mtx * tmpva + 0x72, 0x5f, 0x32, 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x68, 0x61, 0x6c, // r_2).xyz);. hal + 0x66, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x3b, 0x0a, 0x20, 0x20, 0x74, // f4 tmpvar_4;. t + 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, // mpvar_4 = half4( + 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, // s_texColor.sampl + 0x65, 0x28, 0x5f, 0x6d, 0x74, 0x6c, 0x73, 0x6d, 0x70, 0x5f, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x43, // e(_mtlsmp_s_texC + 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x29, 0x28, 0x74, // olor, (float3)(t + 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x33, 0x29, 0x2c, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x28, // mpvar_3), level( + 0x5f, 0x6d, 0x74, 0x6c, 0x5f, 0x75, 0x2e, 0x75, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, // _mtl_u.u_params. + 0x78, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x5f, 0x6d, 0x74, 0x6c, 0x5f, 0x6f, 0x2e, 0x67, // x)));. _mtl_o.g + 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x28, 0x28, // l_FragColor = (( + 0x68, 0x61, 0x6c, 0x66, 0x34, 0x29, 0x28, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x29, 0x74, // half4)((float4)t + 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x34, 0x20, 0x2a, 0x20, 0x5f, 0x6d, 0x74, 0x6c, 0x5f, 0x69, // mpvar_4 * _mtl_i + 0x2e, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x72, // .v_color0));. r + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x6d, 0x74, 0x6c, 0x5f, 0x6f, 0x3b, 0x0a, 0x7d, 0x0a, // eturn _mtl_o;.}. + 0x0a, 0x00, // .. +}; diff --git a/3rdparty/bgfx/tools/texturev/fs_texture_cube.sc b/3rdparty/bgfx/tools/texturev/fs_texture_cube.sc new file mode 100644 index 00000000000..d15b23cdea6 --- /dev/null +++ b/3rdparty/bgfx/tools/texturev/fs_texture_cube.sc @@ -0,0 +1,21 @@ +$input v_texcoord0, v_color0 + +/* + * Copyright 2011-2016 Branimir Karadzic. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include + +SAMPLERCUBE(s_texColor, 0); +uniform mat4 u_mtx; + +uniform vec4 u_params; +#define u_textureLod u_params.x + +void main() +{ + vec3 dir = vec3( (v_texcoord0*2.0 - 1.0) * vec2(1.0, -1.0), 1.0); + dir = normalize(mul(u_mtx, vec4(dir, 0.0) ).xyz); + gl_FragColor = textureCubeLod(s_texColor, dir, u_textureLod) * v_color0; +} diff --git a/3rdparty/bgfx/tools/texturev/makefile b/3rdparty/bgfx/tools/texturev/makefile new file mode 100644 index 00000000000..31820c53b37 --- /dev/null +++ b/3rdparty/bgfx/tools/texturev/makefile @@ -0,0 +1,6 @@ +# +# Copyright 2011-2015 Branimir Karadzic. All rights reserved. +# License: http://www.opensource.org/licenses/BSD-2-Clause +# + +include ../../../bgfx/scripts/shader-embeded.mk diff --git a/3rdparty/bgfx/tools/texturev/texturev.cpp b/3rdparty/bgfx/tools/texturev/texturev.cpp new file mode 100644 index 00000000000..ef976d626f4 --- /dev/null +++ b/3rdparty/bgfx/tools/texturev/texturev.cpp @@ -0,0 +1,718 @@ +/* + * Copyright 2011-2016 Branimir Karadzic. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "common.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "vs_texture.bin.h" +#include "fs_texture.bin.h" +#include "vs_texture_cube.bin.h" +#include "fs_texture_cube.bin.h" + +#include + +#include +#include +#include +namespace stl = tinystl; + +#include "image.h" + +struct Binding +{ + enum Enum + { + App, + View, + + Count + }; +}; + +static const InputBinding s_bindingApp[] = +{ + { entry::Key::Esc, entry::Modifier::None, 1, NULL, "exit" }, + { entry::Key::KeyF, entry::Modifier::None, 1, NULL, "graphics fullscreen" }, + + INPUT_BINDING_END +}; + +static const InputBinding s_bindingView[] = +{ + { entry::Key::Comma, entry::Modifier::None, 1, NULL, "view mip prev" }, + { entry::Key::Period, entry::Modifier::None, 1, NULL, "view mip next" }, + { entry::Key::Comma, entry::Modifier::LeftShift, 1, NULL, "view mip" }, + { entry::Key::Comma, entry::Modifier::RightShift, 1, NULL, "view mip" }, + + { entry::Key::Slash, entry::Modifier::None, 1, NULL, "view filter" }, + + { entry::Key::Key0, entry::Modifier::None, 1, NULL, "view zoom 1.0" }, + { entry::Key::Plus, entry::Modifier::None, 1, NULL, "view zoom +0.1" }, + { entry::Key::Minus, entry::Modifier::None, 1, NULL, "view zoom -0.1" }, + + { entry::Key::Up, entry::Modifier::None, 1, NULL, "view file-up" }, + { entry::Key::Down, entry::Modifier::None, 1, NULL, "view file-down" }, + { entry::Key::PageUp, entry::Modifier::None, 1, NULL, "view file-pgup" }, + { entry::Key::PageDown, entry::Modifier::None, 1, NULL, "view file-pgdown" }, + + { entry::Key::KeyH, entry::Modifier::None, 1, NULL, "view help" }, + + INPUT_BINDING_END +}; + +static const char* s_bindingName[] = +{ + "App", + "View", +}; +BX_STATIC_ASSERT(Binding::Count == BX_COUNTOF(s_bindingName) ); + +static const InputBinding* s_binding[] = +{ + s_bindingApp, + s_bindingView, +}; +BX_STATIC_ASSERT(Binding::Count == BX_COUNTOF(s_binding) ); + +struct View +{ + View() + : m_fileIndex(0) + , m_scaleFn(0) + , m_mip(0) + , m_zoom(1.0f) + , m_filter(true) + , m_help(false) + { + } + + ~View() + { + } + int32_t cmd(int32_t _argc, char const* const* _argv) + { + if (_argc >= 2) + { + if (0 == strcmp(_argv[1], "mip") ) + { + if (_argc >= 3) + { + uint32_t mip = m_mip; + if (0 == strcmp(_argv[2], "next") ) + { + ++mip; + } + else if (0 == strcmp(_argv[2], "prev") ) + { + --mip; + } + else if (0 == strcmp(_argv[2], "last") ) + { + mip = INT32_MAX; + } + else + { + mip = atoi(_argv[2]); + } + + m_mip = bx::uint32_iclamp(mip, 0, m_info.numMips-1); + } + else + { + m_mip = 0; + } + } + else if (0 == strcmp(_argv[1], "zoom") ) + { + if (_argc >= 3) + { + float zoom = (float)atof(_argv[2]); + + if (_argv[2][0] == '+' + || _argv[2][0] == '-') + { + m_zoom += zoom; + } + else + { + m_zoom = zoom; + } + + m_zoom = bx::fclamp(m_zoom, 0.001f, 10.0f); + } + else + { + m_zoom = 1.0f; + } + } + else if (0 == strcmp(_argv[1], "filter") ) + { + if (_argc >= 3) + { + m_filter = bx::toBool(_argv[2]); + } + else + { + m_filter ^= true; + } + } + else if (0 == strcmp(_argv[1], "file-up") ) + { + m_fileIndex = bx::uint32_satsub(m_fileIndex, 1); + } + else if (0 == strcmp(_argv[1], "file-down") ) + { + uint32_t numFiles = bx::uint32_satsub(uint32_t(m_fileList.size() ), 1); + ++m_fileIndex; + m_fileIndex = bx::uint32_min(m_fileIndex, numFiles); + } + else if (0 == strcmp(_argv[1], "help") ) + { + m_help ^= true; + } + } + + return 0; + } + + void updateFileList(const char* _path, const char* _fileName = "") + { + std::string path = _path; + + DIR* dir = opendir(_path); + + if (NULL == dir) + { + path = "."; + } + + dir = opendir(path.c_str() ); + if (NULL != dir) + { + for (dirent* item = readdir(dir); NULL != item; item = readdir(dir) ) + { + if (0 == (item->d_type & DT_DIR) ) + { + const char* ext = strrchr(item->d_name, '.'); + if (NULL != ext) + { + if (0 == bx::stricmp(ext, ".dds") + || 0 == bx::stricmp(ext, ".jpg") + || 0 == bx::stricmp(ext, ".jpeg") + || 0 == bx::stricmp(ext, ".hdr") + || 0 == bx::stricmp(ext, ".ktx") + || 0 == bx::stricmp(ext, ".png") + || 0 == bx::stricmp(ext, ".pvr") + || 0 == bx::stricmp(ext, ".tga") + ) + { + if (0 == strcmp(_fileName, item->d_name) ) + { + m_fileIndex = uint32_t(m_fileList.size() ); + } + + std::string name = path; + char ch = name.back(); + name += '/' == ch || '\\' == ch ? "" : "/"; + name += item->d_name; + m_fileList.push_back(name); + } + } + } + } + + closedir(dir); + } + } + + typedef stl::vector FileList; + FileList m_fileList; + + bgfx::TextureInfo m_info; + uint32_t m_fileIndex; + uint32_t m_scaleFn; + uint32_t m_mip; + float m_zoom; + bool m_filter; + bool m_help; +}; + +int cmdView(CmdContext* /*_context*/, void* _userData, int _argc, char const* const* _argv) +{ + View* view = static_cast(_userData); + return view->cmd(_argc, _argv); +} + +struct PosUvColorVertex +{ + float m_x; + float m_y; + float m_u; + float m_v; + uint32_t m_abgr; + + static void init() + { + ms_decl + .begin() + .add(bgfx::Attrib::Position, 2, bgfx::AttribType::Float) + .add(bgfx::Attrib::TexCoord0, 2, bgfx::AttribType::Float) + .add(bgfx::Attrib::Color0, 4, bgfx::AttribType::Uint8, true) + .end(); + } + + static bgfx::VertexDecl ms_decl; +}; + +bgfx::VertexDecl PosUvColorVertex::ms_decl; + +bool screenQuad(int32_t _x, int32_t _y, int32_t _width, uint32_t _height, bool _originBottomLeft = false) +{ + if (bgfx::checkAvailTransientVertexBuffer(6, PosUvColorVertex::ms_decl) ) + { + bgfx::TransientVertexBuffer vb; + bgfx::allocTransientVertexBuffer(&vb, 6, PosUvColorVertex::ms_decl); + PosUvColorVertex* vertex = (PosUvColorVertex*)vb.data; + + const float widthf = float(_width); + const float heightf = float(_height); + + const float minx = float(_x); + const float miny = float(_y); + const float maxx = minx+widthf; + const float maxy = miny+heightf; + + float m_halfTexel = 0.0f; + + const float texelHalfW = m_halfTexel/widthf; + const float texelHalfH = m_halfTexel/heightf; + const float minu = texelHalfW; + const float maxu = 1.0f - texelHalfW; + const float minv = _originBottomLeft ? texelHalfH+1.0f : texelHalfH ; + const float maxv = _originBottomLeft ? texelHalfH : texelHalfH+1.0f; + + vertex[0].m_x = minx; + vertex[0].m_y = miny; + vertex[0].m_u = minu; + vertex[0].m_v = minv; + + vertex[1].m_x = maxx; + vertex[1].m_y = miny; + vertex[1].m_u = maxu; + vertex[1].m_v = minv; + + vertex[2].m_x = maxx; + vertex[2].m_y = maxy; + vertex[2].m_u = maxu; + vertex[2].m_v = maxv; + + vertex[3].m_x = maxx; + vertex[3].m_y = maxy; + vertex[3].m_u = maxu; + vertex[3].m_v = maxv; + + vertex[4].m_x = minx; + vertex[4].m_y = maxy; + vertex[4].m_u = minu; + vertex[4].m_v = maxv; + + vertex[5].m_x = minx; + vertex[5].m_y = miny; + vertex[5].m_u = minu; + vertex[5].m_v = minv; + + vertex[0].m_abgr = UINT32_MAX; + vertex[1].m_abgr = UINT32_MAX; + vertex[2].m_abgr = UINT32_MAX; + vertex[3].m_abgr = UINT32_MAX; + vertex[4].m_abgr = UINT32_MAX; + vertex[5].m_abgr = UINT32_MAX; + + bgfx::setVertexBuffer(&vb); + + return true; + } + + return false; +} + +struct Interpolator +{ + float from; + float to; + float duration; + int64_t offset; + + Interpolator(float _value) + { + reset(_value); + } + + void reset(float _value) + { + from = _value; + to = _value; + duration = 0.0; + offset = bx::getHPCounter(); + } + + void set(float _value, float _duration) + { + if (_value != to) + { + from = getValue(); + to = _value; + duration = _duration; + offset = bx::getHPCounter(); + } + } + + float getValue() + { + + if (duration > 0.0) + { + const double freq = double(bx::getHPFrequency() ); + int64_t now = bx::getHPCounter(); + float time = (float)(double(now - offset) / freq); + float lerp = bx::fclamp(time, 0.0, duration) / duration; + return bx::flerp(from, to, lerp); + } + + return to; + } +}; + +void help(const char* _error = NULL) +{ + if (NULL != _error) + { + fprintf(stderr, "Error:\n%s\n\n", _error); + } + + fprintf(stderr + , "texturev, bgfx texture viewer tool\n" + "Copyright 2011-2016 Branimir Karadzic. All rights reserved.\n" + "License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause\n\n" + ); + + fprintf(stderr + , "Usage: texturev \n" + "\n" + "For additional information, see https://github.com/bkaradzic/bgfx\n" + ); +} + +int _main_(int _argc, char** _argv) +{ + uint32_t width = 1280; + uint32_t height = 720; + uint32_t debug = BGFX_DEBUG_TEXT; + uint32_t reset = BGFX_RESET_VSYNC; + + inputAddBindings(s_bindingName[Binding::App], s_binding[Binding::App]); + inputAddBindings(s_bindingName[Binding::View], s_binding[Binding::View]); + + View view; + cmdAdd("view", cmdView, &view); + + bgfx::init(); + bgfx::reset(width, height, reset); + + // Set view 0 clear state. + bgfx::setViewClear(0 + , BGFX_CLEAR_COLOR|BGFX_CLEAR_DEPTH + , 0x101010ff + , 1.0f + , 0 + ); + + imguiCreate(); + + PosUvColorVertex::init(); + + const bgfx::Memory* vs_texture; + const bgfx::Memory* fs_texture; + const bgfx::Memory* vs_texture_cube; + const bgfx::Memory* fs_texture_cube; + + switch (bgfx::getRendererType()) + { + case bgfx::RendererType::Direct3D9: + vs_texture = bgfx::makeRef(vs_texture_dx9, sizeof(vs_texture_dx9) ); + fs_texture = bgfx::makeRef(fs_texture_dx9, sizeof(fs_texture_dx9) ); + vs_texture_cube = bgfx::makeRef(vs_texture_cube_dx9, sizeof(vs_texture_cube_dx9) ); + fs_texture_cube = bgfx::makeRef(fs_texture_cube_dx9, sizeof(fs_texture_cube_dx9) ); + break; + + case bgfx::RendererType::Direct3D11: + case bgfx::RendererType::Direct3D12: + vs_texture = bgfx::makeRef(vs_texture_dx11, sizeof(vs_texture_dx11) ); + fs_texture = bgfx::makeRef(fs_texture_dx11, sizeof(fs_texture_dx11) ); + vs_texture_cube = bgfx::makeRef(vs_texture_cube_dx11, sizeof(vs_texture_cube_dx11) ); + fs_texture_cube = bgfx::makeRef(fs_texture_cube_dx11, sizeof(fs_texture_cube_dx11) ); + break; + + default: + vs_texture = bgfx::makeRef(vs_texture_glsl, sizeof(vs_texture_glsl) ); + fs_texture = bgfx::makeRef(fs_texture_glsl, sizeof(fs_texture_glsl) ); + vs_texture_cube = bgfx::makeRef(vs_texture_cube_glsl, sizeof(vs_texture_cube_glsl) ); + fs_texture_cube = bgfx::makeRef(fs_texture_cube_glsl, sizeof(fs_texture_cube_glsl) ); + break; + } + + bgfx::ProgramHandle textureProgram = bgfx::createProgram( + bgfx::createShader(vs_texture) + , bgfx::createShader(fs_texture) + , true + ); + + bgfx::ProgramHandle textureCubeProgram = bgfx::createProgram( + bgfx::createShader(vs_texture_cube) + , bgfx::createShader(fs_texture_cube) + , true + ); + + bgfx::UniformHandle s_texColor = bgfx::createUniform("s_texColor", bgfx::UniformType::Int1); + bgfx::UniformHandle u_mtx = bgfx::createUniform("u_mtx", bgfx::UniformType::Mat4); + bgfx::UniformHandle u_params = bgfx::createUniform("u_params", bgfx::UniformType::Vec4); + + float speed = 0.37f; + float time = 0.0f; + + Interpolator mip(0.0); + Interpolator zoom(1.0); + Interpolator scale(1.0); + + const char* filePath = _argc < 2 ? "" : _argv[1]; + bool directory = false; + + bx::FileInfo fi; + bx::stat(filePath, fi); + directory = bx::FileInfo::Directory == fi.m_type; + + std::string path = filePath; + if (!directory) + { + const char* fileName = directory ? filePath : bx::baseName(filePath); + path.assign(filePath, fileName); + view.updateFileList(path.c_str(), fileName); + } + else + { + view.updateFileList(path.c_str() ); + } + + int exitcode = EXIT_SUCCESS; + bgfx::TextureHandle texture = BGFX_INVALID_HANDLE; + + if (view.m_fileList.empty() ) + { + exitcode = EXIT_FAILURE; + if (2 > _argc) + { + help("File path is not specified."); + } + else + { + fprintf(stderr, "Unable to load '%s' texture.\n", filePath); + } + } + else + { + uint32_t fileIndex = 0; + + entry::MouseState mouseState; + while (!entry::processEvents(width, height, debug, reset, &mouseState) ) + { + imguiBeginFrame(mouseState.m_mx + , mouseState.m_my + , (mouseState.m_buttons[entry::MouseButton::Left ] ? IMGUI_MBUT_LEFT : 0) + | (mouseState.m_buttons[entry::MouseButton::Right ] ? IMGUI_MBUT_RIGHT : 0) + | (mouseState.m_buttons[entry::MouseButton::Middle] ? IMGUI_MBUT_MIDDLE : 0) + , mouseState.m_mz + , width + , height + ); + + static bool help = false; + + if (help == false + && help != view.m_help) + { + ImGui::OpenPopup("Help"); + } + + if (ImGui::BeginPopupModal("Help", NULL, ImGuiWindowFlags_AlwaysAutoResize) ) + { + ImGui::SetWindowFontScale(1.2f); + + ImGui::Text( + "texturev, bgfx texture viewer tool\n" + "Copyright 2011-2016 Branimir Karadzic. All rights reserved.\n" + "License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause\n" + ); + ImGui::Separator(); + ImGui::NextLine(); + + ImGui::Text("Key bindings:\n\n"); + + ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), "ESC"); ImGui::SameLine(64); ImGui::Text("Exit."); + ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), "h"); ImGui::SameLine(64); ImGui::Text("Toggle help screen."); + ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), "f"); ImGui::SameLine(64); ImGui::Text("Toggle full-screen."); + ImGui::NextLine(); + + ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), "-"); ImGui::SameLine(64); ImGui::Text("Zoom out."); + ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), "="); ImGui::SameLine(64); ImGui::Text("Zoom in."); + ImGui::NextLine(); + + ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), ","); ImGui::SameLine(64); ImGui::Text("MIP level up."); + ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), "."); ImGui::SameLine(64); ImGui::Text("MIP level down."); + ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), "/"); ImGui::SameLine(64); ImGui::Text("Toggle linear/point texture sampling."); + ImGui::NextLine(); + + ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), "up"); ImGui::SameLine(64); ImGui::Text("Previous texture."); + ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), "down"); ImGui::SameLine(64); ImGui::Text("Next texture."); + ImGui::NextLine(); + + ImGui::Dummy(ImVec2(0.0f, 0.0f) ); + ImGui::SameLine(ImGui::GetWindowWidth() - 136.0f); + if (ImGui::Button("Close", ImVec2(128.0f, 0.0f) ) + || !view.m_help) + { + view.m_help = false; + ImGui::CloseCurrentPopup(); + } + + ImGui::EndPopup(); + } + + help = view.m_help; + +// bool b; +// ImGui::ShowTestWindow(&b); + + imguiEndFrame(); + + if (!bgfx::isValid(texture) + || view.m_fileIndex != fileIndex) + { + if (bgfx::isValid(texture) ) + { + bgfx::destroyTexture(texture); + } + + fileIndex = view.m_fileIndex; + + filePath = view.m_fileList[view.m_fileIndex].c_str(); + + texture = loadTexture(filePath + , 0 + | BGFX_TEXTURE_U_CLAMP + | BGFX_TEXTURE_V_CLAMP + | BGFX_TEXTURE_W_CLAMP + , 0 + , &view.m_info + ); + + std::string title; + bx::stringPrintf(title, "%s (%d x %d%s, %s)" + , filePath + , view.m_info.width + , view.m_info.height + , view.m_info.cubeMap ? " CubeMap" : "" + , bgfx::getName(view.m_info.format) + ); + entry::WindowHandle handle = { 0 }; + entry::setWindowTitle(handle, title.c_str() ); + } + + int64_t now = bx::getHPCounter(); + static int64_t last = now; + const int64_t frameTime = now - last; + last = now; + const double freq = double(bx::getHPFrequency() ); + + time += (float)(frameTime*speed/freq); + + float ortho[16]; + bx::mtxOrtho(ortho, 0.0f, (float)width, (float)height, 0.0f, 0.0f, 1000.0f); + bgfx::setViewTransform(0, NULL, ortho); + bgfx::setViewRect(0, 0, 0, width, height); + bgfx::touch(0); + + bgfx::dbgTextClear(); + + scale.set( + bx::fmin( float(width) / float(view.m_info.width) + , float(height) / float(view.m_info.height) + ) + , 0.1f + ); + zoom.set(view.m_zoom, 0.25); + + float ss = scale.getValue() * zoom.getValue(); + + screenQuad( int(width - view.m_info.width * ss)/2 + , int(height - view.m_info.height * ss)/2 + , int(view.m_info.width * ss) + , int(view.m_info.height * ss) + ); + + float mtx[16]; + bx::mtxRotateXY(mtx, 0.0f, time); + bgfx::setUniform(u_mtx, mtx); + + mip.set( float(view.m_mip), 0.5f); + + float params[4] = { mip.getValue(), 0.0f, 0.0f, 0.0f }; + bgfx::setUniform(u_params, params); + + bgfx::setTexture(0 + , s_texColor + , texture + , view.m_filter + ? BGFX_TEXTURE_NONE + : 0 + | BGFX_TEXTURE_MIN_POINT + | BGFX_TEXTURE_MIP_POINT + | BGFX_TEXTURE_MAG_POINT + ); + bgfx::setState(0 + | BGFX_STATE_RGB_WRITE + | BGFX_STATE_ALPHA_WRITE + ); + bgfx::submit(0, view.m_info.cubeMap ? textureCubeProgram : textureProgram); + + bgfx::frame(); + } + } + + if (bgfx::isValid(texture) ) + { + bgfx::destroyTexture(texture); + } + bgfx::destroyUniform(s_texColor); + bgfx::destroyUniform(u_mtx); + bgfx::destroyUniform(u_params); + bgfx::destroyProgram(textureProgram); + bgfx::destroyProgram(textureCubeProgram); + + imguiDestroy(); + + bgfx::shutdown(); + + return exitcode; +} diff --git a/3rdparty/bgfx/tools/texturev/varying.def.sc b/3rdparty/bgfx/tools/texturev/varying.def.sc new file mode 100644 index 00000000000..41b4dbd51c5 --- /dev/null +++ b/3rdparty/bgfx/tools/texturev/varying.def.sc @@ -0,0 +1,8 @@ +vec4 v_color0 : COLOR0 = vec4(1.0, 0.0, 0.0, 1.0); +vec3 v_normal : NORMAL = vec3(0.0, 0.0, 1.0); +vec2 v_texcoord0 : TEXCOORD0 = vec2(0.0, 0.0); + +vec3 a_position : POSITION; +vec4 a_normal : NORMAL; +vec4 a_color0 : COLOR0; +vec2 a_texcoord0 : TEXCOORD0; diff --git a/3rdparty/bgfx/tools/texturev/vs_texture.bin.h b/3rdparty/bgfx/tools/texturev/vs_texture.bin.h new file mode 100644 index 00000000000..88614882adc --- /dev/null +++ b/3rdparty/bgfx/tools/texturev/vs_texture.bin.h @@ -0,0 +1,144 @@ +static const uint8_t vs_texture_glsl[419] = +{ + 0x56, 0x53, 0x48, 0x04, 0x01, 0x83, 0xf2, 0xe1, 0x01, 0x00, 0x0a, 0x75, 0x5f, 0x76, 0x69, 0x65, // VSH........u_vie + 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x01, 0x00, 0x83, 0x01, 0x00, 0x00, 0x61, // wProj..........a + 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, // ttribute highp v + 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, // ec4 a_color0;.at + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, // tribute highp ve + 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x61, // c3 a_position;.a + 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, // ttribute highp v + 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, // ec2 a_texcoord0; + 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, // .varying highp v + 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x61, // ec4 v_color0;.va + 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, // rying highp vec2 + 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x75, 0x6e, // v_texcoord0;.un + 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x6d, 0x61, 0x74, 0x34, // iform highp mat4 + 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, 0x6f, 0x69, // u_viewProj;.voi + 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x68, 0x69, // d main ().{. hi + 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // ghp vec4 tmpvar_ + 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x7a, 0x77, // 1;. tmpvar_1.zw + 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, // = vec2(0.0, 1.0 + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, // );. tmpvar_1.xy + 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, // = a_position.xy + 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, // ;. gl_Position + 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, // = (u_viewProj * + 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, // tmpvar_1);. v_t + 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, // excoord0 = a_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // coord0;. v_colo + 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x7d, // r0 = a_color0;.} + 0x0a, 0x0a, 0x00, // ... +}; +static const uint8_t vs_texture_dx9[330] = +{ + 0x56, 0x53, 0x48, 0x04, 0x01, 0x83, 0xf2, 0xe1, 0x01, 0x00, 0x0a, 0x75, 0x5f, 0x76, 0x69, 0x65, // VSH........u_vie + 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, 0x2c, 0x01, 0x00, 0x03, 0xfe, // wProj......,.... + 0xff, 0xfe, 0xff, 0x23, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, // ...#.CTAB....S.. + 0x00, 0x00, 0x03, 0xfe, 0xff, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x91, 0x00, // ................ + 0x00, 0x4c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, // .L...0.......... + 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, // .<.......u_viewP + 0x72, 0x6f, 0x6a, 0x00, 0xab, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, // roj............. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x73, 0x5f, 0x33, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, // .....vs_3_0.Micr + 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, // osoft (R) HLSL S + 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x31, // hader Compiler 1 + 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x30, 0x30, 0x31, 0x31, 0x2e, 0x31, 0x36, 0x33, 0x38, 0x34, 0x00, // 0.0.10011.16384. + 0xab, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, // ................ + 0x02, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, // ................ + 0x80, 0x02, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, // ................ + 0xe0, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0f, 0xe0, 0x1f, 0x00, 0x00, // ................ + 0x02, 0x05, 0x00, 0x00, 0x80, 0x02, 0x00, 0x03, 0xe0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, // ................ + 0x80, 0x01, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x55, 0x90, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0f, // .......U........ + 0x80, 0x00, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, // ................ + 0x03, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0xe4, 0x80, 0x03, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x00, // ................ + 0x02, 0x01, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0xe4, 0x90, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x03, // ................ + 0xe0, 0x02, 0x00, 0xe4, 0x90, 0xff, 0xff, 0x00, 0x00, 0x00, // .......... +}; +static const uint8_t vs_texture_dx11[575] = +{ + 0x56, 0x53, 0x48, 0x04, 0x01, 0x83, 0xf2, 0xe1, 0x01, 0x00, 0x0a, 0x75, 0x5f, 0x76, 0x69, 0x65, // VSH........u_vie + 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x18, 0x02, 0x44, 0x58, 0x42, // wProj........DXB + 0x43, 0x02, 0x1b, 0xea, 0x24, 0x10, 0xd8, 0x6f, 0x23, 0xf5, 0xf6, 0x01, 0x38, 0x5b, 0x08, 0x13, // C...$..o#...8[.. + 0x4d, 0x01, 0x00, 0x00, 0x00, 0x18, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, // M............,.. + 0x00, 0x9c, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x49, 0x53, 0x47, 0x4e, 0x68, 0x00, 0x00, // .........ISGNh.. + 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // .........P...... + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, // ................ + 0x00, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, // .V.............. + 0x00, 0x01, 0x00, 0x00, 0x00, 0x07, 0x03, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........._...... + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, // ................ + 0x00, 0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x00, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x00, // .COLOR.POSITION. + 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x4f, 0x53, 0x47, 0x4e, 0x6c, 0x00, 0x00, // TEXCOORD.OSGNl.. + 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // .........P...... + 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, // ................ + 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, // ................ + 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // .........b...... + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x0c, 0x00, // ................ + 0x00, 0x53, 0x56, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x00, 0x43, 0x4f, 0x4c, // .SV_POSITION.COL + 0x4f, 0x52, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0xab, 0x53, 0x48, 0x44, // OR.TEXCOORD..SHD + 0x52, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, // R....@...@...Y.. + 0x04, 0x46, 0x8e, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, // .F. ........._.. + 0x03, 0xf2, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x03, 0x32, 0x10, 0x10, // ........._...2.. + 0x00, 0x01, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x03, 0x32, 0x10, 0x10, 0x00, 0x02, 0x00, 0x00, // ....._...2...... + 0x00, 0x67, 0x00, 0x00, 0x04, 0xf2, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, // .g.... ......... + 0x00, 0x65, 0x00, 0x00, 0x03, 0xf2, 0x20, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, // .e.... ......e.. + 0x03, 0x32, 0x20, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, // .2 ......h...... + 0x00, 0x38, 0x00, 0x00, 0x08, 0xf2, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x15, 0x10, // .8...........V.. + 0x00, 0x01, 0x00, 0x00, 0x00, 0x46, 0x8e, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, // .....F. ........ + 0x00, 0x32, 0x00, 0x00, 0x0a, 0xf2, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x8e, 0x20, // .2...........F. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x10, 0x10, 0x00, 0x01, 0x00, 0x00, // ................ + 0x00, 0x46, 0x0e, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xf2, 0x20, 0x10, // .F............ . + 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0e, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x8e, 0x20, // .....F.......F. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x05, 0xf2, 0x20, 0x10, // .........6.... . + 0x00, 0x01, 0x00, 0x00, 0x00, 0x46, 0x1e, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, // .....F.......6.. + 0x05, 0x32, 0x20, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x46, 0x10, 0x10, 0x00, 0x02, 0x00, 0x00, // .2 ......F...... + 0x00, 0x3e, 0x00, 0x00, 0x01, 0x00, 0x03, 0x05, 0x00, 0x01, 0x00, 0x10, 0x00, 0x40, 0x00, // .>...........@. +}; +static const uint8_t vs_texture_mtl[757] = +{ + 0x56, 0x53, 0x48, 0x04, 0x01, 0x83, 0xf2, 0xe1, 0x00, 0x00, 0xe6, 0x02, 0x00, 0x00, 0x75, 0x73, // VSH...........us + 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x6d, 0x65, // ing namespace me + 0x74, 0x61, 0x6c, 0x3b, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x78, 0x6c, 0x61, 0x74, // tal;.struct xlat + 0x4d, 0x74, 0x6c, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x7b, // MtlShaderInput { + 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // . float4 a_colo + 0x72, 0x30, 0x20, 0x5b, 0x5b, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x30, // r0 [[attribute(0 + 0x29, 0x5d, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x61, 0x5f, // )]];. float3 a_ + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x61, 0x74, 0x74, 0x72, 0x69, // position [[attri + 0x62, 0x75, 0x74, 0x65, 0x28, 0x31, 0x29, 0x5d, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, // bute(1)]];. flo + 0x61, 0x74, 0x32, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, // at2 a_texcoord0 + 0x5b, 0x5b, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x32, 0x29, 0x5d, 0x5d, // [[attribute(2)]] + 0x3b, 0x0a, 0x7d, 0x3b, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x78, 0x6c, 0x61, 0x74, // ;.};.struct xlat + 0x4d, 0x74, 0x6c, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, // MtlShaderOutput + 0x7b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, // {. float4 gl_Po + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, // sition [[positio + 0x6e, 0x5d, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x76, 0x5f, // n]];. float4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, // color0;. float2 + 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x7d, 0x3b, // v_texcoord0;.}; + 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x78, 0x6c, 0x61, 0x74, 0x4d, 0x74, 0x6c, 0x53, // .struct xlatMtlS + 0x68, 0x61, 0x64, 0x65, 0x72, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x7b, 0x0a, 0x20, // haderUniform {. + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, // float4x4 u_view + 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x7d, 0x3b, 0x0a, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, // Proj;.};.vertex + 0x78, 0x6c, 0x61, 0x74, 0x4d, 0x74, 0x6c, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x4f, 0x75, 0x74, // xlatMtlShaderOut + 0x70, 0x75, 0x74, 0x20, 0x78, 0x6c, 0x61, 0x74, 0x4d, 0x74, 0x6c, 0x4d, 0x61, 0x69, 0x6e, 0x20, // put xlatMtlMain + 0x28, 0x78, 0x6c, 0x61, 0x74, 0x4d, 0x74, 0x6c, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x49, 0x6e, // (xlatMtlShaderIn + 0x70, 0x75, 0x74, 0x20, 0x5f, 0x6d, 0x74, 0x6c, 0x5f, 0x69, 0x20, 0x5b, 0x5b, 0x73, 0x74, 0x61, // put _mtl_i [[sta + 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, // ge_in]], constan + 0x74, 0x20, 0x78, 0x6c, 0x61, 0x74, 0x4d, 0x74, 0x6c, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x55, // t xlatMtlShaderU + 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x26, 0x20, 0x5f, 0x6d, 0x74, 0x6c, 0x5f, 0x75, 0x20, 0x5b, // niform& _mtl_u [ + 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x29, 0x0a, 0x7b, 0x0a, // [buffer(0)]]).{. + 0x20, 0x20, 0x78, 0x6c, 0x61, 0x74, 0x4d, 0x74, 0x6c, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x4f, // xlatMtlShaderO + 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x5f, 0x6d, 0x74, 0x6c, 0x5f, 0x6f, 0x3b, 0x0a, 0x20, 0x20, // utput _mtl_o;. + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, // float4 tmpvar_1; + 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x7a, 0x77, 0x20, 0x3d, // . tmpvar_1.zw = + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, // float2(0.0, 1.0 + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, // );. tmpvar_1.xy + 0x20, 0x3d, 0x20, 0x5f, 0x6d, 0x74, 0x6c, 0x5f, 0x69, 0x2e, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, // = _mtl_i.a_posi + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x5f, 0x6d, 0x74, 0x6c, 0x5f, // tion.xy;. _mtl_ + 0x6f, 0x2e, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, // o.gl_Position = + 0x28, 0x5f, 0x6d, 0x74, 0x6c, 0x5f, 0x75, 0x2e, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, // (_mtl_u.u_viewPr + 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x3b, 0x0a, // oj * tmpvar_1);. + 0x20, 0x20, 0x5f, 0x6d, 0x74, 0x6c, 0x5f, 0x6f, 0x2e, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // _mtl_o.v_texco + 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x6d, 0x74, 0x6c, 0x5f, 0x69, 0x2e, 0x61, 0x5f, // ord0 = _mtl_i.a_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x5f, 0x6d, 0x74, // texcoord0;. _mt + 0x6c, 0x5f, 0x6f, 0x2e, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x5f, // l_o.v_color0 = _ + 0x6d, 0x74, 0x6c, 0x5f, 0x69, 0x2e, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, // mtl_i.a_color0;. + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x6d, 0x74, 0x6c, 0x5f, 0x6f, 0x3b, // return _mtl_o; + 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // .}... +}; diff --git a/3rdparty/bgfx/tools/texturev/vs_texture.sc b/3rdparty/bgfx/tools/texturev/vs_texture.sc new file mode 100644 index 00000000000..bb589efdfde --- /dev/null +++ b/3rdparty/bgfx/tools/texturev/vs_texture.sc @@ -0,0 +1,16 @@ +$input a_position, a_texcoord0, a_color0 +$output v_texcoord0, v_color0 + +/* + * Copyright 2011-2016 Branimir Karadzic. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include + +void main() +{ + gl_Position = mul(u_viewProj, vec4(a_position.xy, 0.0, 1.0) ); + v_texcoord0 = a_texcoord0; + v_color0 = a_color0; +} diff --git a/3rdparty/bgfx/tools/texturev/vs_texture_cube.bin.h b/3rdparty/bgfx/tools/texturev/vs_texture_cube.bin.h new file mode 100644 index 00000000000..bc752d5c0eb --- /dev/null +++ b/3rdparty/bgfx/tools/texturev/vs_texture_cube.bin.h @@ -0,0 +1,148 @@ +static const uint8_t vs_texture_cube_glsl[420] = +{ + 0x56, 0x53, 0x48, 0x04, 0x01, 0x83, 0xf2, 0xe1, 0x01, 0x00, 0x0f, 0x75, 0x5f, 0x6d, 0x6f, 0x64, // VSH........u_mod + 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x01, 0x00, // elViewProj...... + 0x7f, 0x01, 0x00, 0x00, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, // ....attribute hi + 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // ghp vec4 a_color + 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, 0x67, // 0;.attribute hig + 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, // hp vec3 a_positi + 0x6f, 0x6e, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x68, 0x69, // on;.attribute hi + 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, // ghp vec2 a_texco + 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, // ord0;.varying hi + 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // ghp vec4 v_color + 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, // 0;.varying highp + 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, // vec2 v_texcoord + 0x30, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, // 0;.uniform highp + 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, // mat4 u_modelVie + 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, // wProj;.void main + 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x76, 0x65, // ().{. highp ve + 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, // c4 tmpvar_1;. t + 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, // mpvar_1.w = 1.0; + 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, // . tmpvar_1.xyz + 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, // = a_position;. + 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x75, // gl_Position = (u + 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, // _modelViewProj * + 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, // tmpvar_1);. v_ + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, // texcoord0 = a_te + 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, // xcoord0;. v_col + 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, // or0 = a_color0;. + 0x7d, 0x0a, 0x0a, 0x00, // }... +}; +static const uint8_t vs_texture_cube_dx9[359] = +{ + 0x56, 0x53, 0x48, 0x04, 0x01, 0x83, 0xf2, 0xe1, 0x01, 0x00, 0x0f, 0x75, 0x5f, 0x6d, 0x6f, 0x64, // VSH........u_mod + 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x01, 0x00, 0x00, 0x04, 0x00, // elViewProj...... + 0x44, 0x01, 0x00, 0x03, 0xfe, 0xff, 0xfe, 0xff, 0x24, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, // D.......$.CTAB.. + 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfe, 0xff, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, // ..W............. + 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, // ......P...0..... + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x5f, // ......@.......u_ + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x00, 0x03, 0x00, // modelViewProj... + 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x73, // ..............vs + 0x5f, 0x33, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, // _3_0.Microsoft ( + 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, // R) HLSL Shader C + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x31, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x30, 0x30, // ompiler 10.0.100 + 0x31, 0x31, 0x2e, 0x31, 0x36, 0x33, 0x38, 0x34, 0x00, 0xab, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, // 11.16384........ + 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, // ................ + 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x02, 0x00, 0x0f, 0x90, 0x1f, 0x00, // ................ + 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0xe0, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, // ................ + 0x00, 0x80, 0x01, 0x00, 0x0f, 0xe0, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x02, 0x00, // ................ + 0x03, 0xe0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, 0x01, 0x00, 0xe4, 0xa0, 0x01, 0x00, // ................ + 0x55, 0x90, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0xa0, 0x01, 0x00, // U............... + 0x00, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, 0x02, 0x00, // ................ + 0xe4, 0xa0, 0x01, 0x00, 0xaa, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, // ................ + 0x0f, 0xe0, 0x00, 0x00, 0xe4, 0x80, 0x03, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, // ................ + 0x0f, 0xe0, 0x00, 0x00, 0xe4, 0x90, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x03, 0xe0, 0x02, 0x00, // ................ + 0xe4, 0x90, 0xff, 0xff, 0x00, 0x00, 0x00, // ....... +}; +static const uint8_t vs_texture_cube_dx11[620] = +{ + 0x56, 0x53, 0x48, 0x04, 0x01, 0x83, 0xf2, 0xe1, 0x01, 0x00, 0x0f, 0x75, 0x5f, 0x6d, 0x6f, 0x64, // VSH........u_mod + 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, // elViewProj...... + 0x40, 0x02, 0x44, 0x58, 0x42, 0x43, 0x25, 0x0b, 0xbc, 0xf2, 0xf1, 0x2f, 0x13, 0x1a, 0x84, 0x83, // @.DXBC%..../.... + 0x08, 0xf9, 0x08, 0xa1, 0x2c, 0x84, 0x01, 0x00, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x03, 0x00, // ....,.....@..... + 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x49, 0x53, // ..,...........IS + 0x47, 0x4e, 0x68, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x50, 0x00, // GNh...........P. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, // ................ + 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ......V......... + 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x5f, 0x00, // .............._. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, // ................ + 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x00, 0x50, 0x4f, 0x53, 0x49, // ......COLOR.POSI + 0x54, 0x49, 0x4f, 0x4e, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x4f, 0x53, // TION.TEXCOORD.OS + 0x47, 0x4e, 0x6c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x50, 0x00, // GNl...........P. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, // ................ + 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................ + 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x62, 0x00, // ..............b. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, // ................ + 0x00, 0x00, 0x03, 0x0c, 0x00, 0x00, 0x53, 0x56, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, // ......SV_POSITIO + 0x4e, 0x00, 0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, // N.COLOR.TEXCOORD + 0x00, 0xab, 0x53, 0x48, 0x44, 0x52, 0x28, 0x01, 0x00, 0x00, 0x40, 0x00, 0x01, 0x00, 0x4a, 0x00, // ..SHDR(...@...J. + 0x00, 0x00, 0x59, 0x00, 0x00, 0x04, 0x46, 0x8e, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, // ..Y...F. ....... + 0x00, 0x00, 0x5f, 0x00, 0x00, 0x03, 0xf2, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x00, // .._..........._. + 0x00, 0x03, 0x72, 0x10, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x03, 0x32, 0x10, // ..r......._...2. + 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, 0x04, 0xf2, 0x20, 0x10, 0x00, 0x00, 0x00, // ......g.... .... + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x03, 0xf2, 0x20, 0x10, 0x00, 0x01, 0x00, // ......e.... .... + 0x00, 0x00, 0x65, 0x00, 0x00, 0x03, 0x32, 0x20, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x68, 0x00, // ..e...2 ......h. + 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x08, 0xf2, 0x00, 0x10, 0x00, 0x00, 0x00, // ......8......... + 0x00, 0x00, 0x56, 0x15, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x46, 0x8e, 0x20, 0x00, 0x00, 0x00, // ..V.......F. ... + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x0a, 0xf2, 0x00, 0x10, 0x00, 0x00, 0x00, // ......2......... + 0x00, 0x00, 0x46, 0x8e, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x10, // ..F. ........... + 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x46, 0x0e, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, // ......F.......2. + 0x00, 0x0a, 0xf2, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x8e, 0x20, 0x00, 0x00, 0x00, // ..........F. ... + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xa6, 0x1a, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x46, 0x0e, // ..............F. + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xf2, 0x20, 0x10, 0x00, 0x00, 0x00, // ........... .... + 0x00, 0x00, 0x46, 0x0e, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x8e, 0x20, 0x00, 0x00, 0x00, // ..F.......F. ... + 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x05, 0xf2, 0x20, 0x10, 0x00, 0x01, 0x00, // ......6.... .... + 0x00, 0x00, 0x46, 0x1e, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x05, 0x32, 0x20, // ..F.......6...2 + 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x46, 0x10, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3e, 0x00, // ......F.......>. + 0x00, 0x01, 0x00, 0x03, 0x05, 0x00, 0x01, 0x00, 0x10, 0x00, 0x40, 0x00, // ..........@. +}; +static const uint8_t vs_texture_cube_mtl[751] = +{ + 0x56, 0x53, 0x48, 0x04, 0x01, 0x83, 0xf2, 0xe1, 0x00, 0x00, 0xe0, 0x02, 0x00, 0x00, 0x75, 0x73, // VSH...........us + 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x6d, 0x65, // ing namespace me + 0x74, 0x61, 0x6c, 0x3b, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x78, 0x6c, 0x61, 0x74, // tal;.struct xlat + 0x4d, 0x74, 0x6c, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x7b, // MtlShaderInput { + 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // . float4 a_colo + 0x72, 0x30, 0x20, 0x5b, 0x5b, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x30, // r0 [[attribute(0 + 0x29, 0x5d, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x61, 0x5f, // )]];. float3 a_ + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x61, 0x74, 0x74, 0x72, 0x69, // position [[attri + 0x62, 0x75, 0x74, 0x65, 0x28, 0x31, 0x29, 0x5d, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, // bute(1)]];. flo + 0x61, 0x74, 0x32, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, // at2 a_texcoord0 + 0x5b, 0x5b, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x32, 0x29, 0x5d, 0x5d, // [[attribute(2)]] + 0x3b, 0x0a, 0x7d, 0x3b, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x78, 0x6c, 0x61, 0x74, // ;.};.struct xlat + 0x4d, 0x74, 0x6c, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, // MtlShaderOutput + 0x7b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, // {. float4 gl_Po + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, // sition [[positio + 0x6e, 0x5d, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x76, 0x5f, // n]];. float4 v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, // color0;. float2 + 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x7d, 0x3b, // v_texcoord0;.}; + 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x78, 0x6c, 0x61, 0x74, 0x4d, 0x74, 0x6c, 0x53, // .struct xlatMtlS + 0x68, 0x61, 0x64, 0x65, 0x72, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x7b, 0x0a, 0x20, // haderUniform {. + 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // float4x4 u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x7d, 0x3b, 0x0a, 0x76, 0x65, // lViewProj;.};.ve + 0x72, 0x74, 0x65, 0x78, 0x20, 0x78, 0x6c, 0x61, 0x74, 0x4d, 0x74, 0x6c, 0x53, 0x68, 0x61, 0x64, // rtex xlatMtlShad + 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x78, 0x6c, 0x61, 0x74, 0x4d, 0x74, 0x6c, // erOutput xlatMtl + 0x4d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x78, 0x6c, 0x61, 0x74, 0x4d, 0x74, 0x6c, 0x53, 0x68, 0x61, // Main (xlatMtlSha + 0x64, 0x65, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x5f, 0x6d, 0x74, 0x6c, 0x5f, 0x69, 0x20, // derInput _mtl_i + 0x5b, 0x5b, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, // [[stage_in]], co + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x78, 0x6c, 0x61, 0x74, 0x4d, 0x74, 0x6c, 0x53, 0x68, // nstant xlatMtlSh + 0x61, 0x64, 0x65, 0x72, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x26, 0x20, 0x5f, 0x6d, 0x74, // aderUniform& _mt + 0x6c, 0x5f, 0x75, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x30, 0x29, 0x5d, // l_u [[buffer(0)] + 0x5d, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x78, 0x6c, 0x61, 0x74, 0x4d, 0x74, 0x6c, 0x53, 0x68, // ]).{. xlatMtlSh + 0x61, 0x64, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x5f, 0x6d, 0x74, 0x6c, 0x5f, // aderOutput _mtl_ + 0x6f, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, // o;. float4 tmpv + 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // ar_1;. tmpvar_1 + 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, // .w = 1.0;. tmpv + 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x5f, 0x6d, 0x74, 0x6c, 0x5f, // ar_1.xyz = _mtl_ + 0x69, 0x2e, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, // i.a_position;. + 0x5f, 0x6d, 0x74, 0x6c, 0x5f, 0x6f, 0x2e, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, // _mtl_o.gl_Positi + 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x5f, 0x6d, 0x74, 0x6c, 0x5f, 0x75, 0x2e, 0x75, 0x5f, 0x6d, // on = (_mtl_u.u_m + 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x74, // odelViewProj * t + 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x5f, 0x6d, 0x74, 0x6c, // mpvar_1);. _mtl + 0x5f, 0x6f, 0x2e, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, // _o.v_texcoord0 = + 0x20, 0x5f, 0x6d, 0x74, 0x6c, 0x5f, 0x69, 0x2e, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // _mtl_i.a_texcoo + 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x5f, 0x6d, 0x74, 0x6c, 0x5f, 0x6f, 0x2e, 0x76, 0x5f, // rd0;. _mtl_o.v_ + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x6d, 0x74, 0x6c, 0x5f, 0x69, 0x2e, // color0 = _mtl_i. + 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, // a_color0;. retu + 0x72, 0x6e, 0x20, 0x5f, 0x6d, 0x74, 0x6c, 0x5f, 0x6f, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // rn _mtl_o;.}... +}; diff --git a/3rdparty/bgfx/tools/texturev/vs_texture_cube.sc b/3rdparty/bgfx/tools/texturev/vs_texture_cube.sc new file mode 100644 index 00000000000..51155fad4e2 --- /dev/null +++ b/3rdparty/bgfx/tools/texturev/vs_texture_cube.sc @@ -0,0 +1,16 @@ +$input a_position, a_texcoord0, a_color0 +$output v_texcoord0, v_color0 + +/* + * Copyright 2011-2016 Branimir Karadzic. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include + +void main() +{ + gl_Position = mul(u_modelViewProj, vec4(a_position, 1.0) ); + v_texcoord0 = a_texcoord0; + v_color0 = a_color0; +} diff --git a/3rdparty/bx/README.md b/3rdparty/bx/README.md index 88cb1bf55ac..0e17833a8d6 100644 --- a/3rdparty/bx/README.md +++ b/3rdparty/bx/README.md @@ -5,6 +5,8 @@ Base library. [![Build Status](https://travis-ci.org/bkaradzic/bx.svg?branch=master)](https://travis-ci.org/bkaradzic/bx) [![Build status](https://ci.appveyor.com/api/projects/status/edras3mltmoy31g5?svg=true)](https://ci.appveyor.com/project/bkaradzic/bx) +[![License](https://img.shields.io/badge/license-BSD--2%20clause-blue.svg)](https://bkaradzic.github.io/bgfx/license.html) +[![Join the chat at https://gitter.im/bkaradzic/bgfx](https://badges.gitter.im/bkaradzic/bgfx.svg)](https://gitter.im/bkaradzic/bgfx) Contact ------- diff --git a/3rdparty/bx/include/bx/debug.h b/3rdparty/bx/include/bx/debug.h index fc78b7b3e07..1154ab74e2c 100644 --- a/3rdparty/bx/include/bx/debug.h +++ b/3rdparty/bx/include/bx/debug.h @@ -10,7 +10,7 @@ #if BX_PLATFORM_ANDROID # include -#elif BX_PLATFORM_WINDOWS || BX_PLATFORM_WINRT || BX_PLATFORM_XBOX360 +#elif BX_PLATFORM_WINDOWS || BX_PLATFORM_WINRT || BX_PLATFORM_XBOX360 || BX_PLATFORM_XBOXONE extern "C" __declspec(dllimport) void __stdcall OutputDebugStringA(const char* _str); #elif BX_PLATFORM_IOS || BX_PLATFORM_OSX # if defined(__OBJC__) @@ -55,7 +55,7 @@ namespace bx # define BX_ANDROID_LOG_TAG "" # endif // BX_ANDROID_LOG_TAG __android_log_write(ANDROID_LOG_DEBUG, BX_ANDROID_LOG_TAG, _out); -#elif BX_PLATFORM_WINDOWS || BX_PLATFORM_WINRT || BX_PLATFORM_XBOX360 +#elif BX_PLATFORM_WINDOWS || BX_PLATFORM_WINRT || BX_PLATFORM_XBOX360 || BX_PLATFORM_XBOXONE OutputDebugStringA(_out); #elif BX_PLATFORM_IOS || BX_PLATFORM_OSX # if defined(__OBJC__) diff --git a/3rdparty/bx/include/bx/os.h b/3rdparty/bx/include/bx/os.h index db9113979f8..9794baf5b3b 100644 --- a/3rdparty/bx/include/bx/os.h +++ b/3rdparty/bx/include/bx/os.h @@ -8,6 +8,7 @@ #include "bx.h" #include "debug.h" +#include #if BX_PLATFORM_WINDOWS || BX_PLATFORM_WINRT # include @@ -274,6 +275,65 @@ namespace bx #endif // BX_COMPILER_ } + struct FileInfo + { + enum Enum + { + Regular, + Directory, + + Count + }; + + uint64_t m_size; + Enum m_type; + }; + + inline bool stat(const char* _filePath, FileInfo& _fileInfo) + { + _fileInfo.m_size = 0; + _fileInfo.m_type = FileInfo::Count; + +#if BX_COMPILER_MSVC + struct ::_stat64 st; + int32_t result = ::_stat64(_filePath, &st); + + if (0 != result) + { + return false; + } + + if (0 != (st.st_mode & _S_IFREG) ) + { + _fileInfo.m_type = FileInfo::Regular; + } + else if (0 != (st.st_mode & _S_IFDIR) ) + { + _fileInfo.m_type = FileInfo::Directory; + } +#else + struct ::stat st; + int32_t result = ::stat(_filePath, &st); + if (0 != result) + { + return false; + } + + if (0 != (st.st_mode & S_IFREG) ) + { + _fileInfo.m_type = FileInfo::Regular; + } + else if (0 != (st.st_mode & S_IFDIR) ) + { + _fileInfo.m_type = FileInfo::Directory; + } +#endif // BX_COMPILER_MSVC + + _fileInfo.m_size = st.st_size; + + return true; + } + } // namespace bx #endif // BX_OS_H_HEADER_GUARD diff --git a/3rdparty/bx/include/bx/thread.h b/3rdparty/bx/include/bx/thread.h index 5e3a920c1ce..0cdc1f45438 100644 --- a/3rdparty/bx/include/bx/thread.h +++ b/3rdparty/bx/include/bx/thread.h @@ -65,7 +65,7 @@ namespace bx m_stackSize = _stackSize; m_running = true; -#if BX_PLATFORM_WINDOWS || BX_PLATFORM_XBOX360 +#if BX_PLATFORM_WINDOWS || BX_PLATFORM_XBOX360 || BX_PLATFORM_XBOXONE m_handle = ::CreateThread(NULL , m_stackSize , (LPTHREAD_START_ROUTINE)threadFunc @@ -103,6 +103,8 @@ namespace bx result = pthread_create(&m_handle, &attr, &threadFunc, this); BX_CHECK(0 == result, "pthread_attr_setschedparam failed! %d", result); +#else +# error "Not implemented!" #endif // BX_PLATFORM_ m_sem.wait(); diff --git a/3rdparty/bx/include/compat/mingw/dirent.h b/3rdparty/bx/include/compat/mingw/dirent.h new file mode 100644 index 00000000000..18aa7f86df7 --- /dev/null +++ b/3rdparty/bx/include/compat/mingw/dirent.h @@ -0,0 +1,5 @@ +// BK - MinGW dirent is super broken, using MSVC compatibility one... +#ifndef _DIRENT_H_ +# define _DIRENT_H_ +# include "../msvc/dirent.h" +#endif // _DIRENT_H_ diff --git a/3rdparty/bx/include/compat/mingw/dxsdk.patch b/3rdparty/bx/include/compat/mingw/dxsdk.patch deleted file mode 100644 index e7554219152..00000000000 --- a/3rdparty/bx/include/compat/mingw/dxsdk.patch +++ /dev/null @@ -1,135 +0,0 @@ -diff -p Include.orig/d3d9.h Include/d3d9.h -*** Include.orig/d3d9.h 2010-05-19 15:36:57.570669600 -0700 ---- Include/d3d9.h 2013-04-07 13:52:57.504138700 -0700 -*************** typedef struct IDirect3DQuery9 *LPDIRECT -*** 2022,2029 **** - - - /********************* -! /* D3D9Ex interfaces -! /*********************/ - - HRESULT WINAPI Direct3DCreate9Ex(UINT SDKVersion, IDirect3D9Ex**); - ---- 2022,2029 ---- - - - /********************* -! * D3D9Ex interfaces -! *********************/ - - HRESULT WINAPI Direct3DCreate9Ex(UINT SDKVersion, IDirect3D9Ex**); - -diff -p Include.orig/d3d9types.h Include/d3d9types.h -*** Include.orig/d3d9types.h 2010-05-19 15:36:57.601870200 -0700 ---- Include/d3d9types.h 2013-04-07 13:52:17.746590200 -0700 -*************** -*** 19,24 **** ---- 19,25 ---- - - #include - -+ #ifdef _MSC_VER - #if _MSC_VER >= 1200 - #pragma warning(push) - #endif -*************** -*** 26,31 **** ---- 27,33 ---- - #if defined(_X86_) || defined(_IA64_) - #pragma pack(4) - #endif -+ #endif // _MSC_VER - - // D3DCOLOR is equivalent to D3DFMT_A8R8G8B8 - #ifndef D3DCOLOR_DEFINED -*************** typedef struct _D3DAES_CTR_IV -*** 2404,2415 **** ---- 2406,2419 ---- - #endif // !D3D_DISABLE_9EX - /* -- D3D9Ex only */ - -+ #ifdef _MSC_VER - #pragma pack() - #if _MSC_VER >= 1200 - #pragma warning(pop) - #else - #pragma warning(default:4201) - #endif -+ #endif // _MSC_VER - - #endif /* (DIRECT3D_VERSION >= 0x0900) */ - #endif /* _d3d9TYPES(P)_H_ */ -diff -p Include.orig/D3Dcommon.h Include/D3Dcommon.h -*** Include.orig/D3Dcommon.h 2010-05-19 15:36:57.664271400 -0700 ---- Include/D3Dcommon.h 2013-04-07 23:35:07.133638400 -0700 -*************** -*** 6,12 **** ---- 6,14 ---- - /* File created by MIDL compiler version 7.00.0555 */ - /* @@MIDL_FILE_HEADING( ) */ - -+ #ifdef _MSC_VER - #pragma warning( disable: 4049 ) /* more than 64k source lines */ -+ #endif // _MSC_VER - - - /* verify that the version is high enough to compile this file*/ -diff -p Include.orig/d3dx9core.h Include/d3dx9core.h -*** Include.orig/d3dx9core.h 2010-05-19 15:36:57.820274400 -0700 ---- Include/d3dx9core.h 2013-04-07 23:34:00.976237500 -0700 -*************** HRESULT WINAPI -*** 665,681 **** - // TRUE = OpenGL line emulation on. - // FALSE = OpenGL line emulation off. - // -- // OpenGL line: Regular line: -- // *\ *\ -- // | \ / \ -- // | \ *\ \ -- // *\ \ \ \ -- // \ \ \ \ -- // \ * \ * -- // \ | \ / -- // \| * -- // * -- // - // OnLostDevice, OnResetDevice - - // Call OnLostDevice() on this object before calling Reset() on the - // device, so that this object can release any stateblocks and video ---- 665,670 ---- -diff -p Include.orig/d3dx9math.h Include/d3dx9math.h -*** Include.orig/d3dx9math.h 2010-05-19 15:36:57.835874700 -0700 ---- Include/d3dx9math.h 2013-04-07 23:31:38.685168800 -0700 -*************** -*** 12,22 **** ---- 12,24 ---- - #ifndef __D3DX9MATH_H__ - #define __D3DX9MATH_H__ - -+ #ifdef _MSC_VER - #include - #if _MSC_VER >= 1200 - #pragma warning(push) - #endif - #pragma warning(disable:4201) // anonymous unions warning -+ #endif // _MSC_VER - - - -*************** HRESULT WINAPI D3DXSHProjectCubeMap -*** 1786,1796 **** ---- 1788,1800 ---- - - #include "d3dx9math.inl" - -+ #ifdef _MSC_VER - #if _MSC_VER >= 1200 - #pragma warning(pop) - #else - #pragma warning(default:4201) - #endif -+ #endif // _MSC_VER - - #endif // __D3DX9MATH_H__ - diff --git a/3rdparty/bx/include/compat/msvc/dirent.h b/3rdparty/bx/include/compat/msvc/dirent.h index 6f959a50185..06523528177 100644 --- a/3rdparty/bx/include/compat/msvc/dirent.h +++ b/3rdparty/bx/include/compat/msvc/dirent.h @@ -27,6 +27,12 @@ #ifndef DIRENT_H #define DIRENT_H +#ifdef _MSC_VER +# pragma warning(disable:4505) // error C4505: '_wreaddir': unreferenced local function has been removed +#else +# pragma GCC diagnostic ignored "-Wunused-function" +#endif // _MSC_VER + /* * Define architecture flags so we don't need to include windows.h. * Avoiding windows.h makes it simpler to use windows sockets in conjunction @@ -143,13 +149,33 @@ * only defined for compatibility. These macros should always return false * on Windows. */ -#define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO) -#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) -#define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) -#define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK) -#define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK) -#define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR) -#define S_ISBLK(mode) (((mode) & S_IFMT) == S_IFBLK) +#ifndef S_ISFIFO +# define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO) +#endif + +#ifndef S_ISDIR +# define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) +#endif + +#ifndef S_ISREG +# define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) +#endif + +#ifndef S_ISLNK +# define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK) +#endif + +#ifndef S_ISSOCK +# define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK) +#endif + +#ifndef S_ISCHR +# define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR) +#endif + +#ifndef S_ISBLK +# define S_ISBLK(mode) (((mode) & S_IFMT) == S_IFBLK) +#endif /* Return the exact length of d_namlen without zero terminator */ #define _D_EXACT_NAMLEN(p) ((p)->d_namlen) @@ -355,11 +381,11 @@ _wreaddir( if (datap) { size_t n; DWORD attr; - + /* Pointer to directory entry to return */ entp = &dirp->ent; - /* + /* * Copy file name as wide-character string. If the file name is too * long to fit in to the destination buffer, then truncate file name * to PATH_MAX characters and zero-terminate the buffer. @@ -515,12 +541,12 @@ dirent_next( return p; } -/* +/* * Open directory stream using plain old C-string. */ static DIR* opendir( - const char *dirname) + const char *dirname) { struct DIR *dirp; int error; @@ -552,7 +578,7 @@ opendir( } } else { - /* + /* * Cannot convert file name to wide-character string. This * occurs if the string contains invalid multi-byte sequences or * the output buffer is too small to contain the resulting @@ -590,7 +616,7 @@ opendir( */ static struct dirent* readdir( - DIR *dirp) + DIR *dirp) { WIN32_FIND_DATAW *datap; struct dirent *entp; @@ -605,7 +631,7 @@ readdir( error = dirent_wcstombs_s( &n, dirp->ent.d_name, PATH_MAX, datap->cFileName, PATH_MAX); - /* + /* * If the file name cannot be represented by a multi-byte string, * then attempt to use old 8+3 file name. This allows traditional * Unix-code to access some file names despite of unicode @@ -617,7 +643,7 @@ readdir( */ if (error && datap->cAlternateFileName[0] != '\0') { error = dirent_wcstombs_s( - &n, dirp->ent.d_name, PATH_MAX, + &n, dirp->ent.d_name, PATH_MAX, datap->cAlternateFileName, PATH_MAX); } @@ -645,7 +671,7 @@ readdir( entp->d_reclen = sizeof (struct dirent); } else { - /* + /* * Cannot convert file name to multi-byte string so construct * an errornous directory entry and return that. Note that * we cannot return NULL as that would stop the processing @@ -673,7 +699,7 @@ readdir( */ static int closedir( - DIR *dirp) + DIR *dirp) { int ok; if (dirp) { @@ -700,7 +726,7 @@ closedir( */ static void rewinddir( - DIR* dirp) + DIR* dirp) { /* Rewind wide-character string directory stream */ _wrewinddir (dirp->wdirp); @@ -830,9 +856,7 @@ dirent_set_errno( #endif } - #ifdef __cplusplus } #endif #endif /*DIRENT_H*/ - diff --git a/3rdparty/bx/scripts/toolchain.lua b/3rdparty/bx/scripts/toolchain.lua index 4f37458df07..49ed9bd9885 100644 --- a/3rdparty/bx/scripts/toolchain.lua +++ b/3rdparty/bx/scripts/toolchain.lua @@ -339,9 +339,9 @@ function toolchain(_buildDir, _libDir) location (path.join(_buildDir, "projects", _ACTION .. "-rpi")) elseif "riscv" == _OPTIONS["gcc"] then - premake.gcc.cc = "/opt/riscv/bin/riscv64-unknown-elf-gcc" - premake.gcc.cxx = "/opt/riscv/bin/riscv64-unknown-elf-g++" - premake.gcc.ar = "/opt/riscv/bin/riscv64-unknown-elf-ar" + premake.gcc.cc = "$(RISCV_DIR)/bin/riscv64-unknown-elf-gcc" + premake.gcc.cxx = "$(RISCV_DIR)/bin/riscv64-unknown-elf-g++" + premake.gcc.ar = "$(RISCV_DIR)/bin/riscv64-unknown-elf-ar" location (path.join(_buildDir, "projects", _ACTION .. "-riscv")) end @@ -1139,9 +1139,13 @@ function toolchain(_buildDir, _libDir) configuration { "riscv" } targetdir (path.join(_buildDir, "riscv/bin")) objdir (path.join(_buildDir, "riscv/obj")) + includedirs { + "$(RISCV_DIR)/sysroot/usr/include", + } buildoptions { "-Wunused-value", "-Wundef", + "--sysroot=$(RISCV_DIR)/sysroot", } buildoptions_cpp { "-std=c++0x", diff --git a/3rdparty/bx/tools/bin/darwin/genie b/3rdparty/bx/tools/bin/darwin/genie index 4ecf8c000ae399a83e451877f8e66b406cd4a5bb..711b1d11897f1f82b88d790457df37c0be98cf68 100644 GIT binary patch delta 39945 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

YNLgmC}X^} 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

n}ffhFYxHem^y-=qeps!1s*{XI2m^| z9z5@7&OZx$Y8!Jpc+gBW$m#iShOp8QOs4(d#%`c1(QBByge6YvmZ_zK)Fjs3CURfr!6{u?|6yZ|577J|zz=KLGM zO()~?|1JpE=?g&B<)^@1!GD3v%jZJr}b9_?1HcX z8BT-K7qI^tI16Ls8MqprxuqEQKt-M7^MQ||hf0EX;Sp2@zp>#C8$c+HXVwa^Q`tWm>{pIif>Xh(z_#4jkz_&$y3HB(g5Td_J`E0i%6tWU75@9+ zG56U24x9nMm3|g4pM}0@#jd%CVm1FZKj91&STJ>bz+4Bs5(TyZZ@rumnrJ`0NxP!EG>HMnmB_HPBpz<&rF1phg37|Oc} zzSoHJKLj6b%=|$yjX#sMDGP3%MwghnAVV>58n`0(6B-Z-uGNI|H&#q{+!ovNPVhIc z$SYqYcoRN;4TeZkCo!RghQ&wv|+ zGGFz?``;S{WFf!_4R{ScSCuoEy|{H;Dbd4nH^;oUw{~s4nxIwGH!MWML89WTU+XkU(9u7DK zo`--xz_HEPe+Qh_lKB}p82*o7@2>23F2Oe#fiYGT+_yjbZKWYxMS+1}zn&aW2fU*> zb5n4?j?7eQMch%YlH6tcQD7nPGBl_(cqY2M3fQj~S5O~Zw-a+a z#k4TB#m~I=fPY2{@>Bh$K@c`7fp`@75O@ms9e5tN5FXhY@Rehne+M`fkMICEy&L;a zfr~}s{eKCoF?c{5y#G5v z$U=rV@T4}J;ahMBcnY``cmentcr94NBijkCj2=7=ZqgR-|H}|U(53gmV=;(cgZF@i z5BGo@#!No&gI3&NPw=76%zoe+UonS(m)jtOL1=u016qMS!ASX zeiy#vejC1^eiuG~kKh)37Pz#NDwq^k1oYq`{KFGIz&m;D;4|E0M8@zZOYOVr^I3j7 z+d4319r$zh{a^Y{EsH~x)?x#Tu=Jf(IM_9b9hCq}-`RrEa}u{<>y}?SPXS90>KKRp zUw+Ra0rG=RVCg;A@Ui{5Sl(m+OY6ObrS(3-(so_P^$tn%ea+ba<@vr5Ag}iWme>0W zdm`^ZwGk6a>s^4Q^=5Fs6yw)mX}y~bd;i`edA&^n<~Do1ffg*UcMpzUubtrq2d&rQ v_u*hZ8~5Rt<(Tgjp4ip%-)vAYUWo;FaL|G+;0d1D66_U5@cDhEtfuS#@156Y delta 37291 zcmaL=2V51$_y3RIom&J10Rb!0?23p5d&7!dWA7zmMMcFL_1YB`qpmvksIiL`b zW5KSmp<-ge8hclMXZE}{$>;rj{Qo{4*)z}AIa79ac6N3y_h!X}yet09Gds~Y(qZ{O z|03rsF6Y}dr^TX?JS{^VEtalx?pF89$kYt6uP`(Vv0g^2>f2HXL%(cey`?^0tL|GQ z3#$*7Sq-^}enG3@zs7Eao=2z;u}$yh$g9^7q5d1#X`{;3zjR_@IA@dd5Ib`XWM>Ak z)o`YZ-0CEZhK8`y5~+JwtNTOsfoLJ-EF-L;W|kUo`b6p*t<_Dn0=L=HEK>hO1(o6A zSD>WX#N6uMwow1t>QaIDa}rrdSJ zYuTx+g_Nr(6{VWCu!SRKklWX6`n;S~eYQq8ER7NiZZk~O_6YrM&QgV^81y=3Vr5HA zQU|x8?_y@yzsu#Y#LTe7Og@w#GS8DxG?!j6R~_*!MLBAOfGc%)GWEPy5(_!%r zwqzEZkTYd>t^`M}0#odkp57hp;f5W3=!x4aZy)=&$tksib7-PjcfDiCc`>eAN<`=p zO{8_vUxj^eW^}ew#R2EM9hOojGiHs@h@!5sc*78567OUTWBn-WfBL9krFUk1htdgG z7dNtB1(qzOSyT(c#3L+Lhe_QM)W&iefA#f!ew1%?+IXW z_8#h@?X@`uu)Rf&q4aZf{lEKLiG<=}{ z^}s@vMa9l~yFwpCu}*r6!nK882YnHlGwoCE6!z4_sSf(HBDutpe0r9mYejMgeQVJZ zLUhna7F#90Z=aH{_{c1I{~T52?r-rXLwy7tZy&9RTTeD?_Q>p zINn@8T;{i&;mz%qQimEPK8#5`o6+wmwXbs2AD`{|va<6;%VsHMq7FL5!}|K0%11<{ z`ugrF?ZmSf-LGn4aXTiZN>yjDxDu0cpyM2C{(A-OmM2+alDs}pqST?783#^$%gj`z zE|BW{yuK7n8Pv6w5WWRcc6INhiTTlbK#x7*Mh*RZk4UjAR2Q)oM7h&?mDu*;#wmSa zY=ro;x_%|bT8&PqxVpNFtLZO#Ruw-~ODWlFzsR~K5G~jm zsK4veTC}X3(xh*gCT3UF2ltB+b*t+8`_&U)tLXN)D9^eTsg$Owl-d>bx^Y)TQiYU! z{UbH;LwUXFfFO}_Tpu{#d*Pl-zdYc+Se94cH?XZ&t-Rb>e`gfTrRmW<^2xKqHFv#k zd|R<5kG>*)k4Vj((qT}HCM>y9)(kGAiQfD58$%L&#^#`=c~Y+=-l1U^mm{Tf!mpYb z>#qk5ix5-%^(Mp0h&KNE#9_n5H$VN$uy&%kUrL+d@tWx4n{skQq9(q2r?ec^O%waF zrMP~mEkw4gDPPCbw~3YxJ!V3z_-5C)PM9l3+x1!#dx-pYeZ$1DBGr~sbW)}!Y6-pA zlt58c=rL1viF%f~Q}vt|GHsTO?U@$KuWGJpl=z-T;H6Ak%Eqalnsv)JTgskkLo{pB zSDRjPdIjsyueOxF(*rcC=NDVbgc%()Ys1erJ$+_>>+Vmslx9g;HEYI4TT16y$26;z zl!CLn3G3~5Ha&4}duxk#wv-2Rdui6w^}TEU;p}-Ll)_X0hb2J-y1Ktn^HXo|x(Mo_dYW zxBmC%VrB%4ov$BT93nc-*B_9nG+%dH5+ZWV*NZI)6rbklF-wBPjd^E&;8TS;`$T) z*PnvKo+tY4pTfkFC%RZsPSk#)S6Y!rL_g76uQ=cy@x-WR?E*b;Wnr<%rq@{+E8fl5 zlUIg|4_5ug%KoCsBfb8rKoR*!@3pFG51m8xN9ww$ zd3M)ki{*(wNkNbF%d3irMH%|HRk_8N3_bVH!^M~keeTc2MZ*mJ;LkV2wudQ8R{ySv z+lhLQwQ;^n?$e0#qem3q1V7%_@2<@)hTYe{tnKISP0pAkyZyc%zb=>f>z+P+-DJ`D zUW)Jf03q^BNhz|ifhMk|>j|3%i;d}e#-<=KBwcq)t}kle(OV?f7WZ%Ki;^SU*W6a+ z1msB9&nLGP`|s$*HkT5);n)$5<Mg_~nQg@kh$?U2d9KdnIMPE6hzy$w)~(c+g!WAJvmi z?iAj)Q)-<`)kJh!if`&$A$~igyPXRc@=!{-a}9)W?oXL;p_Z0o=U(G<&MD(v=c<~Q z1CH!Xxp{GhCc5p>dtdG#YVOg0yL?>;bgMxNLg^Jq7Y5D>KE=5&RS@T&6xP@wYH{M)0=3b)fT)x+fpwI@&m7AJXoDz5d{gHSo!^>T> z)K5G_H%OrkDarRcYa(=AiswV!Dw^-pS3b@Vn^vXFc=B0@EGtr`JrCBz?&T>P{_d@b z7Rz+Mms`cYrTVd#i6U~T-t<*Tk-0=4_o}1Vw?x1Fs=kO{l2Y{b3Ly$FN;&;Dw_SXh ztv~n_oHOSp8u-`tyr8@GeMVA8i?MRpvQZEG94daUqF4VMBx+UFyL_(goG|~N`}=)H zpZ3Q6op&maxOvKW1(Io$WDin?N_(nq-lV9thBIId$0T#iR>Yj(nEQl#Jt(d64QrwD z1*DON`Q&}Z$9A<0@thLP=H^*tXh;7Wc%hx4?fP%rtCfbfX`UYYrIff)Szq|2kJvU( zw|0OmcywfQ0K}JU|^}Bg`m#;sHvAX`^Yw6HY`ag|%nDMxcYUsm8iQh6- zHaChcuIshFRS*SqeayG=;@7$Qu5U%f{JHwwZ>L3rIr^5&7NG^^PzhJ5qt#6E+jkbr z#1Ho9gKEl22&7)}o-;p8YbUPF{$-3-R}(dVl)q_OA<=%ee5ProManoCDzxt6TauhC zwAG?*k}Pi3qD9kLa)4DEn6Kh2Oj3;!KV`I?q#EUwgEYDvJI2aSRxRB9Zjy1PX-TrA zO{*eSB+33Zt+*JHBp2JXNn+nj8DiJUh?6U1E4$WLbXws$Y}ck~;>mQ`FpE|?SFg!5 zJq-9rMNd97v@efZTFyOMcuf{Pae#w z1$ZVDu+sxETTD{b@zZ2_RxMDpEFiyS)k=sO(_{%x>ad_`vX!S+Lp+-*rKc7ymQIzw zd20K@E=-{j=7l=mM$<&zT@}7arP|VH8@Eud^3tA&@X7MWY*bFx$$MB-?sx zL88YbIYQYcljK5WD@~HSy|qwLc#^#7twoAY6Q!3A*~=4UbszHYnJBv`yKZpO#-#80YHmr)|}QZH^2I&`K9PKl`8C;$cS3nnn-W#;Ot@W(=&P zFyQ?d*U$hhMiUE1%Y!+z+M>#6mp!L;KogylEbw zZY`*uEyTPOD<|^&;4#yp3DUa68qbtIq%gPIWTA(bHSL-RBCdyfPwY}m+qN_omRzMTh5i&lX_EB7&D*FX# z$)e#fnLAh;D^3rUi-NU_;?`u@KSV1hHcysoLbR@;LW0Z^suc|kPN0^ldrZwMo;|5$ zG2X?F(hGt;Vv=kWs?`$nhR8XgT83CUSpE>E@;1H1p?)Nvd;=S`?FbJY)8gZ<%yI<)Y{RAI)6%>u6&&v8IbF zwx0G@6FDBrj`g)DF|do&>uZ;V`vcjhftJtu>7`93Hqb6)%|R=NgpioZcCY&~wxPB% zYu|e$bR?nMJ(q7IZCf@mq`d2Bd#$rgoG$Om-$nak7k6v9LSwbjLbNX_f9j=u5bjsx zqTX6iv7#k#9aV3&dPXlWNm11z=)TE<9^CjqX#u4pQ58=-IKJ-k(l19Hd?Q)qNN44~NiRQ!_) zRr(LjfycedaV0=*pF$6d-vi{SDO#Aw?I)j4(UOG7F2_uzdvalRxp=Bpw{E5Ec*xaG z{M0D%Wd=P&El+C3%$OffZyi)ldDE|)G&NbC6r`~iDq8{)mv_uuC)+}-tyaY>gg`t zvcwGP;EUN@hi7QTXw~W^pUtGHy_mNQPNIytyk(6fEm55Fbe&GpG@8b<%Coby93m~N zd@xHJC4@tE|53Xno@JHgXKTmAWp~%t+1dna^WF|zBK0(Xz0Wwg<{zx;f@HL!%Ro=y zn8eBFKWAnREk)=3$c~M7` z>5H^-?m|;Hd6Y$y!Hel+k6L8&#acn}lSPhLtW~qtcxRP+7Hb_vfW?(_i8f0U`Q7EZ zrP?~H=QpctzD&zw4WYz?6q_slyA$YTbqBKf@xgi#E=#-Hl+Xiz1-c`5_9(^_-NQ#pJ)O+00u%Jl8pc9Hjq)OTnx z;=*IstsUBY&AOZ}#?YObO^6o{T|ey7ii%w2PFd9ypLCy$cbyY4Gg_!~m~vn4->v=O zsokTN)1vKo#-Gn*^D>&B+`dPv6E*50Mbo^wnL2?+ZjycIUo@7Jst!`dyY`1CSqQor zT8ZaRm8)RQi>~5(wIQ0gch|LIpXRUmbbM^Jc<(B!O?*HvQwxcDG)Vk56mQLkeF~XHX}-QR2`OF^NOZ z$0WA8M&~_aH_1r>l`hE-salM)8eoYaW|?_?~aTahBXNcvSxkxF~Y+E?n8Uumgl zXxCVKp)@n@7;72-joZdr`hT^hhBh=q9z3I!^J;j*Y8fhipb>6Qz9_|6ZG!)f3+R9Y zDxo?c^MY&PSuNNuTBpiAmuN*7&sCbh3!j!HuF|{4 zw-nj_s#YhfD}~z;HT;xo<5jJeCfaV1e_x|Hv%pE0&vmT^JvV=s-`$`=nRG_lZ)(y0 zU$?3&K=;D8j1Oumpd077Y=2WL6dprE5^oZRX{va)H!E6qYJ?FtyO((iUPokPyq2>- z#?As3OV1eZ0f%~eceme3wHn*^4-Gr|&@1oGb~=-XH)(e3{JYGZMz1Xoj>~yz+6>{_ zONQRk@`$%RWz}2s7;bW0j<}_r?tcClwSo7(-e;T~o|#$y`{6dVit-p_^w5-D|M72N zznk(urpFTX;Jp9lPh`KR@}FY=$YXNNZMsZtkI7TF>FuQ4G5Jby&to#@9kO+g$trhf z+@3k=>Uu|etOdIrQDe~Sr|$n*w%C)YE;R@B`Caz8tM!Pkdzf$6I~nch&P=Scn|jra zE)8GsI)=8Nv@nX>>xo`f&zZzJhe-B0EVKQon)V=>Y z?vlek??Yy0Vx3ev<1>e3*FUv`;@m+Q`j<9XEI%mc|E0|qPmZ|?-_vqfMap4W{UJ^6 zlMc#R59uClaZnz7sNENf_qo<)XtcXra+SRKNXwlk_bN4G#ID$;skfbb^qE|uO zX?tY0$FyYnw%g_QMEgJw43`wo=p|wQE?McB*4lsE9;@Y@O|uOxqn0(a2OQOImt6f! z%M{=L;#%`ub6SN@iY)Ys-d1kya5Z|Rz1MOd-$o-hAZA9L71WRS=o7t|L^ryhmTi+A z-_T2R;5PZ^8?8>RXU1qfTtBgKNd4dIgd3fcWKY{FtG}fcLxZjI(pxReJwin#d4+9t zeS53j(gN1hrj^!=Du*+osgI3)pr{tft`}6TCPuE2SwCuT{G%4CIvZzD7p84g*`p3@ zlzyM+<_g*lWB~2^`>yj)q9N`m8s2h7E)n}R%461)6vX=-6L)E zL0S*v*wZ-nHjaIbW1MjuU>xI(<6z^MU>t`T#}USHlyMww9LE~RamI0iahzlvr$pME zRM|8GrW?nZ#&MQ$oNXNE8pnCYae;AMXdD+C$EC(`xp7=!99J2~)y8qHaa?a4HyX!e zRb<00dC#5f)^j>nDT3FCOmIHnrMv&Qkf zalB|8FB``{jN>)qctahX1=9?;Z5-2$Qc_{BJWGme&0>f#FHXfuvZhhf}|qla+MfqmOaSZXErMV-Dk(%Q)sS zj)BH8$T)@=$1vkqz&I8%jzx@PG2<9+93$vRIrzflQeol{9>1~`IqtdH6JyN9?`a6vZ zhANoJjzKCtj??{BI)T%DRJu2(V^z8%r@N_iGfsC>>Drubr_vQT-AbjyIo({PLpa^I zgpASI9*kx?{T`KN?+r2luD;^x|B*E;&cg>-pT2rD!rc5 z1yy<}rJXeBLKVzrM?RIF#Od5BJ%ZB#DjmmZUzP64X)l#-$!T|$j^VUjrK@mSQ|U-f ze+{Q}0ZxCUwDVCehPTS$$?2CWZQ=AYm41_*?*f(1;Pic!PUG}ll|IkuTPl5w)7Mpc zH>a0ea35vRAS zbPY~#R_U^w-k{P&IK4)t1Dy;j75H#^nM&I@y-1}$`0`z#(oZ=(N2Sv_outy2Ii0A| zCpbM>rT24syh?B5^ca<1&FPV?6f9&Is?sw#JxHa;ak{@sCvdutO84e;tV(y}bT^f5 z#_3Msu2xw@;oKrVUWOD9`DJK+L0i|M;;}Y0R{`P5Rlqt}w|yTU-_te6WzC(7liSZ( zD|&PCVbcrugI=pZd z`7+Yx=SrGyJ0V;(7TNmv_S&S?7sI6T#Tg1TbeP!W`wpy~<9cwmEqqL&*&!eb^95~e$;A(%#RwkRw zd(-AFLuv>&SIm7|VOy3~1NsdZIDCK{@yPZ-c6n?IkV7Ba$^{j!(rjq=xIROA#}2OD zM>TO|6KY*GGy3XdTX3GjRT>TKHLzNp{_zPTRVpHWK(8t#RmwH`iLIaT7*V2E?10$8 z-4bHu(`U9MIrF)#gR@?pCVgVV3K#XD{wy0FQdq@T4T~N!BsO74$Bt$>{|RW(zgt|~ z|Bd=bQdRyZw07)}?+5pZPv|pnK-IASt*Gw6!LhvtOaIrlYSQdp zuWkK`790{5QnFg%@DO#)BYMRqs9{lL*pP&wJ^Boc;L)O7MP07fwvm4FwXeOA%=EOM zbG2}@x3wAUA`a7B4gKr~oMlQyg%tUIVE_Jo5<;TNlq(a}J+^%5a%D@GFV(GFk8r6Ws6mFiwTwtJb<6(U`gb-PEHcrnsd?-%<8TVD0Ifb;>W@!y$ank6s? zrypf%t}=V=S8}+IYW+zq^)nyK=paY1jJ#kE5#`#*?=IM@iFR$|T(a&#Z8@gDjDBj* zDPK^GdqZgPviT)@bupx^Y=6;S*FArG4lN_KEB3rzwW;n1NTuY;m-dniF4^7OgCVt) z;~(2|F1TjTwcvu?O_XUb8(gA7euR6GEOp%;EO%d``qH5d__yFf9k{M2Rd9LtyucoE z&JD`7FpneDt>gdO@E*|Ks>1U-8c_?2c9Nei+Y7nZ?!@6Gxem2)-w@JrS@as6&oPn? zLmJ7wG5ZR&?h~}<@>K=_5;sF@E$2iyxYv$C%FgFIANWQ3-m>TSQYX@_2N%>?u8eZz_Zm&o zkG)wsZgw^O#Y`U=c8yNAZy$Df%EO=S!J1#Id?o&H` zo@udo$4PPBUP$bYlf|x6Cjb5%@l?8Bx94??rnkXs{pAGZ@{DJfpY#o(5f<{N-R6}> z{=WyY{+qn}k?QfJ_peEVS!yGF|DxV5OHvA?#w>Lt=^CU+)$Y8GNhGBYmeX%gZzm_n zy*FqC*%oj?v(#ANzUeMmn!%@~`sTnwmJZ34cPT2Fq{fR_>Y;9j{9b7!jfd1gU7fsM zHfs9MkP336=gr@AH7V@RsKfH zxyo)_*cWn5hSY%1umGLmy5-X27M=_jIsO~9SQ;q@J-~T+O(K27X4d&GGEUXGSysA3r+O7GW5nfks8ijySx&!06};NQxrWQ! z1ylue%F$a{I%RacV>C&BZB+#Y`G!-|Rufm=#vy;IHsp6)CdvO7**%>)YS%AvuCnKM z%OhmnhwkCfP)TDrzhfT#VN=h&GVCrjYyWL!{4X$eO)BFT1~ zqgL|dG@7KL$EC+#bf+yjE=wz$enPhYi>iHil0#c@f#I~H>UoMKA7g?LX(#0;6?p@4 z593C2sF9!Tv}}Km&OGom=V;6`p1RkgA@yeI4N2o6MX(e|mu)Jf0xZ=gY2yEt;z)8r zlCpUTN1!Ju&!G(Cn`u8uRZ_VPWzhR1)q~W@DBYo^hS90=@qKFXCb+7}=rp=kYCbp& z>5~k7O|ugzGtS7q59kt|y&xBpb$@Y@t0-VxO)r1Cz)vBy<=Lk;N&c5Oifi?XBdI>5 zZhVQBae(F6WqIl$HFqyuXSlglXe4yG!qFeN<~WiH z|G`oaw{IRv`5>*~sAD9}g;bpT{3%KEA@$Mm^9i)kT>+B>c8B#0Gm`2idNX=NX(YVsC^BJDw z87Z8k_19&kr_}m%xXN?1nymhY6sj&xpc=#(P>S%Zl4?lu##0)iS#EOCrQ{rMx>cyd ze4xzY>(Gd#VUSvIB?%<0gfyQo_fnF=)8xiy)TDN4T;vR6#`AhZuAR47YRuy$kcQB8 zNV(ni^r=a9g*C)_U%HCUY)N?BF*lo`Km%LkCjeT+rzr)fF9;a%m`v~a=RHBAi zI!Dohk1DZ~G9q1m_cs;U@-BPgId~qqmO|n+q+>rx>+Z@^DtiB)9KBzyCGvautB;ZH zv($$BvC(+Q7Gh`h06Z21iA6OZ@3CNTx!n z!%`KJRzn(Zl;!9_($@?*_$AHEk&or#m$Ynd_E_F{N!6};$_2hRmKVmn+vl0A^om-R z_+0iS>t6l^hxl;I)Y>8#QWD>5YHcwI(tV@b9colpd@1w1rUI6{C#KNN=0}5!qG`s?BAlLSZx}F2cS>j8zO-u@2?yht{(Wt;PrzN$E{FWRD&QfHO|=^Cd)8pNHcp2$UWbH?+0yC#ry5>kJ@h^t9*o*CNPhpmEDnHFhiACjbow)bg|0??)lD9E8S2-TZOBkCM0 zqzWpxvAFSr;>|%zDdKB%y z$hx}~;euLouB8-G4pM$zlOH3g6r{P_?{7%bA=Tm)NFd#0TOf_&NkctZzCoJElZJY- zv@0q%W>U?GMY-k%|8}Vk=_WTuU6Q)RII1&CaU_j~6fQ&a(c^mDKd80_9Q!F^QnC4a z9fjOC!c&j)s&(SYe}Z4$=gvI?1uy3vDd_S)LB?joB$BQ{YRE+;lk^!9O214}p5olt z^XjFT-$RZRm!C98A#ts^3=`C*hT$ASeWV_B>UqB8UrD{NCX@68Qj*MFi5B|m{i9h4 z&RCMKnc%VagU^g zlJb*{+IAnV)ja*El~=b&j&5KyM2@>`cXxx-okyN($QnrF@t`5;9VBB{gEu-(Kq{(M z3&HLufoHjGs`Wcdacy~|mW`H>YfH(+4r8e4lHh4G3|wLS&X zA-*GekW{NQS22TYok`MKNUeFPv6H0BrRCl%jtCK7RzA)`E%>1<=c>#*FjeU4udl#T z1{c(Wq}~-->clOWNzyV%{F3IipQH?;(}tK2WbL)@Y9E$7Meyscy7&g!V<-T|(9|ISg}A>n1GHWe@rQWW=t8b~YuiBbc}{Sq*p zyG7jwGwMkXFY1=F^|Yj;Jo#1UV2u3aMV)pVaxQ+= zISUN_ci8?0sfaXQbxaK82sLE)AYyWq82LCG75||=w`&YXt4XkN1C|nG^J4ra zz6eTj?#(Y0w6uYo?oIg@z?FmZH==kmhz8dR?Kk`9}%_pH2k#`^!Woai#>5#%%qOYS_?m^1Ul8qL9 zS0Ih%P7Wt2rjgv6o!VEi5jQ;_M~@~~1SF%cg5AS_=#^B8XaT7wk6^W~oCAqAMAXb3 zNN+OhASLr&8hxqVQoJ$Ow!nyT#F4b9vHavm4Ved5ZZ#MKJ;^f}N-^%Idn8STG@ScM zy&Ro|6vbCay&T6Pqit!3HkE9Zis&c37C#hx=*&u-0(g!YD5muwN(4QJE zfig&LFT%<_D6|2i))5^kD72}XjKaJoQ97zAS2%>*u#=<_kV{mr<#rF>&iL}YVTXwj@b0{KGH_mKMX zlv;qkHns+m;Q6g3NyES6i~-#3qeJMHN4X%fpCvd?DBQ@8tAc zG*!K6!3DYVI)nbW@Cp>HIY*Q91X6c(Zh@Yp6l}@a_-67-C8-c34AM6w<%Q&Hj9a=S zv}@T?Zp=+h$`2Q964SEED~?>PA+1pl>Oeawms-lOJQSSJifil6Zw>dzwFS~LwK~A( zKGxP|rxa(iy0 zt1NjsayGnks1qpBQRc}`BvhA|(1eTYUsjmZX!Aa?3%l zXhp1+HaogyfMdNB1uvu<3#a=tUm(vXqBBUBDsa=I7kPfjFPEwgzE^8P|ElC;= zsRd7)qe)7RmBm7-osZ!1`uA$@g7oj3=9O5vH`Ec~k=&Dueq@owN;&e=ShvLXVreoj zHBw1B(o5D1qs3%wZ#kH(duSgHp_LMSWZ|W*;@!S1P3K!oz4FxR$5I;ij(Xa^?wQiOgu{oO5)FQ#prmsm%>GPM$#GJKuO$^B=)w)s>|}>Bgg=(omXlTT)4CKSK5` zL~R)ZS82ZRfiz;KLTbYOT$`lLkZNFdBk4Ct1Nid|QnHTZdaHAT)q*4p(m|e=)KYu< zNIAVQReTsOdN)^hy!vz?4N?VY;!k}ikyLIxOH24{c9OIb(gMzyMw0ggj*>j4 z)VgCBq@g@rRv~HM1bL%4-6o?ZN{?`A!OBUTi$C`9Iz}N|AO-P7cuLZ0NZ5bzr{%yw zNQLG2Dvs*z%O`U=*r2FQx7h(m4SBGtr$qW>*`NgVN!2MFjZfaxD@sL3D|x+lkE9)t zFfXd7#BNAo|2!qkAQYwMmn{ey%NJJ7FSe;%;SF3Ll6Fm%(+n@2q(E}(ud8Sd*O5X*XZ-ucv>s5f}f*X>hx?Gf+Rz5%) z%>zZf^E6t>QMALSK7UwEQt`zsVdG29E8QT)awonaX*r}m{Hpjn@MmLPKsS`7<`U^q znoe!}5?Q)5o!a>&T&x$*{i=&LFJ);gH&N{aTbHr4mYb;hXgs8|#)te1UfJ#Hj}d~G z%j{*S*rb)5;ULe8Fw*R6W2_iC2f@>!}LTL{UY z*M_RcCasp0%F=mVT`jwpr3N%y!?`~31fcpR-&&T|^DL;Q-(`?G7?NF0zvpFWMe6c6 zO8Twi4CVfP+xLX@QI3C3O9XWf-C8dfM^TObn>l(4*SM5igCRv4XJafCM{SmQ%27MV zZI(65QLYq(7~2Ol^{Bt{IRkCrKRe0(TjULj7SUU!M|sNCWgFL(C@YqB(BC6aUAwo* zzRI<0JG*!f&Jj+XdUd-zQl4(<0Xx{Wknfq%5>76Y{+4N5_NT~cRseV<%hnXXLj z0~|a8wUBEbq@`+tqQ8n$ACw&<-SR7kcH-?lHJ6k)!qOxzSS?W!kH}F~9Ch8>9%WZk zV;@X7kIKhY=p=hU_A)jv-RlEAc{8X4us)xSn#`L(8p~H%P3Eg1-RGHCold)BT-$$M zUxpu(9@Xd!Tb^WBP2+ZQ?5F4fCuR3)bXEGFlGDk$*E-E1A>0XN=`<=sYQ(d250ctI zYHbwcHIt;tkm_-JcapRkQh#o*THQZ_REr_XVpu-n)=E&CyyfV~Wx4*L}L1FX%)4fTNyge?MF z7Pba#BiOdEJz(Pv>!goyAWVau2fG3`8Fn}9G1&94X|NfvZ(uF-mpU{MEuOHsVAWsn zC_PeHs^3xtLJVw6*sic~up?k6!On(V3cDV5C+s2ERM=~<_h4U;b*h%o4^S8_a&xft zhYf)Zhphlx8@3s2N7&x539#c}XTmOoT@Aa{Hkeur~aDrw?o( zES-z-FK9B~Rhx^_-?Y$=RXP_;V&Qpi{_W7E;2-iauK`<&F>e9iFT%VNJS7+NKJd{% z<|E+HFy>US&g`^YgU|y3e}YTp=L}E5;i1g$!Ijk+&^dhtcL-*7!x*J^9d%l>!ZP`as9 z{3q}euw^QrV83zfw}TTVE2cim2BGd064bDnGJ|tG`iXPQ1h+|M{+|BCOw}|KJQx0r z;6CsVr(da4aRa~uw=fR{CxI6tf9b7;Kf>|@0y?o^nFu}x-iQn(w^4@we=Tmlf@?He z=meWJ{tRA*0)Gdu0(V}?`OOM1gSWw-WtHL2X88p|4<*cL?(am4t*~ye7X0%9`@#nN zkH6ep?&8x~_y>Ngfjhe~*9ZI1@3g5dzCD}c&GMs~|BtY0!v76;`#=7(iq((z=6e9o zh_8I^&%kvvjZ^c>H$>w)FTzF&=9S8-tI-Vi*cAG;N7cBIXzW>9;wYX1cK2eQ1um40 zc>%buFY`~}0oj>1fhU4@gZD8zEk_}oLclpN{Zy6Ffa~B*;0NG$;OF4O0UZAxye$W_ zP3O*ZyVS5{v zhTlL439ut!C%`_2t<#6Q@Fn;+utoBjjqJ<*Ea3ZKa}H|NkNsZo|E!qmxA;TwisOKM z;4$DZaKHZSFAV+_Tml?Dfc<5_8^9I8M+UOLCfFlhuu}@DJ?20Ny@^ zSXCImlv{iYxAbsuk)JukSny`>6z~Ob5_s@xj-Lx&0bU3`qFCL*y_R!@=jdlI)EV^y z4}cv4Yc3p~E#|mU(9Jt}EO;X96xc*qbB6d4th04m7C@nEiVNV&B?w~UeF2Sb3K7f4&t1h?tw_yeMz!un@u=`+-!KT7qfxQj; z5cY+#>JI)0L9FD0v%>no`orde4TKGWEdW~twghZx*mAIyVXMQ|B5S;$)`QRpwi#?o z*bcB=V7tS{!uE#k4?7fg6zoLU>9BKQ7q7HCjY0P_gk;#Au=`<;!W#WghyJU$r>5XR zHUxYUJOcdP9li_3gLQB#jIC>TzUP2M1k_4rHt*Zv;MwqR1xxS;@Jeu-yPSV5c;TPK zbeok3`~q%XUf=!#XVmTd**21l!M}*xI+T^?SlL>J|L7DW@io_2t?2pdC5I zm7B8t*p_WXJGQ4fvyJY>wn~4tb>fw!`(pSI7Mc!Y`*sA|UennwN@DwM4%_&j*}83J z+loHTR}FB{&#WoiJ(F#Jf1ANCTd*zFmhItKw#VsLWR3fB!Z;S%)6b!+0^(k?jsCzk z ze5DV$#{38wnp|g2RZRaIkkjrWJ;EirI+k0V6X+}4sx12Z9t*9IEpgbvpp6lO$AQZc z(`%6>54L3Lg4K5=RsNRXfsxEz!M~Pb9tcjSU!hd-Bbl9+d_7p0hJXuwm=}Ok`!lZq zoBJah!RG$RPO!N@@+;WfA2|Uw_eU-pOykJhAW1`jxk2&(j13aY-(YipgcjLGkC^)- z>T@vFL+1X7N~{0O{gJ$2bAP0OVl}^-8zl6912Ho68^>p?uCXd0!Pp?7Wj@&0AEC-y zfM+Lid>3%+bY@y18u_QpU>*v#&0?NF>{J!hfG`~aPOuKn|08Eu2`(^~c|ACpt`#LM zE;C*-p8%f*(=as}6uprBG#NS#Aq~PC1dLh40rZoFhW|7;8@R$!_U8c)#0yM8@G)=+ zF#Q&%(LkEhjPiPdV+37))dNc*v_ycp;k|3nf(XBJ=Zgz0`K0yd;y#W zcHV+emhLC&2+KY29Pr=ZSKu#Ta}UlzpR1@IH22_qz~&xY9n_uyKCjXgLzfv({8YEO>1A9yF2o)$)fpBqfqe>{Yc?VMo-cqMoN z_)!Y`SA!4JjH4=`$B9v(?=Q@|!H0G+{|YX;m-%;a!a-uH-*O4U2_+EU0Vf|}egfY8 zJ2U+ls!?IjlgwFc%jzna+Oo zgP>~A9RQyOSHH{t8{mFm_18)&{wnw-xb9!n|D;>!No@oK-)DBGznM@OmVo`iTfzCj z+2|pm@`r<$fuq20p0K|r*!?+k4EU+~|JkSl+CixDlDQXn`YYza;KSh2;N;irr;R_O z!5QFL;8t(gPw$b2fAw2tS``}XjC{w!b_mtqGrPc}z=yyWKd}D-c=i|O8(?#{_CDCy zt)&xu2{t!vtq!9BPK&vF>&t@0+{MiYHgB z!QVTWV-2S3Z*FZ5LV&roJq~PcZO;JD!B+Piu(`Xu1Z?gutG_f;W60cH-VHW)m(}-# zjpx6)y?g-y=JxVku(`eb3XJV#i$;H1rYbOZmwmzJ?s72L++B_Yo4d>EPwI{5zq!3! z9|7j}a(l43z1#=P+sm{92k*Z0da?laA-U~}_125fFVf9EsPkH9m++5Z-Nz7%sNxI}5@?C#vd z!DS3~T5>@cQI-SpgJ*$DgKJb`e^syq*8!gfw*!}}%<(+ghc0|C>) zIjVAoW#CP9nb(8e>ND>Iw`tG3AKauf^GWcD?#x%fKdHS1s^5|hVRugscmm$qi}?fC z16#sY5AH&9%h(5OZW$K@n_I@E!RD56HL%(;HlF{@AsBnc)S%8_bIZ6t*xWK60XDac zCxXo_;~&B1mhlp>xn;Z#Ok2kM{NDvZ?HQ}N`Y71kGCmJBw~TLr%`M}{U~|j(E7;sJ zR$o6+x4F4xoEJPffzDr5SOh{=dPh1eHus6g zg6BE0Q9Kobxlx=1HaCjrgUyZNihNT8fBxmOmzuL zfWyIM!2`k7!RAhQ6R^1x-U)2(g!c!VJK>`Zru)y_3Qt6UxfMPiY;1*7gVul_V5>X@ z++z(l_*ZbXwamYPo2+9#2X4QC`HEt7|Ly;U1@#>z)dQ_}F+T@;xR@>UKWkF{jk}q> zz%Rgl;J7{P4+a0Qk2wN-9bAFfc>Y)0&jHa0XmEhJ3AoSi%&o!A=*3=LqR!wer@wKg zK}!d#9W-?UPrUH_H+Rt9Ai&%~`vNw1(A=_dh4MNVkR9Cm26Hg@IXE0_ZbX*@n;X&9 zoe<2O=tf|3C%P^8+8wT-8@N_Fa~#;*h#n3$H=-wi&5h{UU~?ndxd?)>6Rk!$*zy-w zuob-JKJy-M?+46B!7X1hp9R1Dz){Dt{1@a#;3otDQ+pqGOYYk2qb9e4%U;m!VJ zupjskI3M^axB&PCxCGez$hivmn(+}dUH|50hIQP40pPCq+t3N%72tW`bnphnH2bOl z^|KmOd%)Ykzk|=ycUF}DI{1ZR_58mJ!KWMtWSAMi&%yEZ%A*Rf`k+E^0C*cX7+j+Q z#}@_1gX@D=5Ucse(#$NNB4_9ZP6zijGgM~(Ff*Qh4N2vn4UVtMycBGy&b$lU415@T zzPf{-|EJA>8l2&pSwJo3bnqeYd(%(fJys3y^rar5*)qKjv!7xbNAY!;Ly5h;d@Rkt zMZs+^;{OJ>#j;$>&JE6pFp`NVu0 zO#iP7qk(DQU%=16XWz5`3%CpXUjFp_SEIPkXAa0mg5sITPy+lqmPd63@Ya6JHNiG; zQ}Et6_O}Pe!ru$L4do5;r{}+_uys$)FxD)v8*?IfZg=Jd;29`jJvbV?1AMCo#~%dO zz*g*e@cA9=zwJ-gUo{{+g@vaGNXK682eSb9?ExGgx`*R)gG=vcE(G4WkGVWpgTDdz zGV*tHLdb)FzTmYdxPTGhC1}7@aOxrUOYlefxQouivKCzBF!N4u@86gYfxUM#J5NJ+ zf-d<3To#-Tj@!u@UV_)5L0S&(kqclyu>Wz64*?HEgGzvh?=t*OOLYk2P(XcfJ)BWX z@B#Elcko%9!C-I=@I-Kr1KfbQ;Dx)GSAZ+dQG=eY|8@w241s=n66`aV?~3!_+*6tF zfH%Vb9DEwA<>Ve2xRB$0z+OKx2ZPTjrur?VA%xH3fI8sn$j}B{CW-xhz=IJ#3VZ}S z9o!SIYD>T`mva8C;Ox`z{=W}GGJOE322m=wAov#e4c^^efP}H>yb=CK;6@MG{}DU_en%eaAv=A~607E%iq-u$<~e65%7P{2F>@90AQadDJn0ep z+krj7y%bXgA*f)eVp^7uqYnnuC7y`*b=5fkT!ZQUy9!|$0z5E?)`3gc;0(WjOTm8( z{Ixp!FMz$kx4|j3*#88q*Jl2#n8u&wVjUK|@)})YDS!;Q!R^4sz^BlFD6j+hYb&NR zZiZ!fEBFJ7@yyp1JQ}ax{fUj||Ne>`FbVK671gnU>6Lz#$!&yMdFDKMvd${si#YPDZ@bG7-Yh-*EwR!0($guK@RY!Mqtf z9()j-06q_PYr*k1z|L3955a#J@pS#)LRgJ6$`Zs~mV^QWzyr|0{NPTwBqhPG`HU>p z!S1cN!sd!;VrquJdG82+#|Gr5`Yrt-{GbHl(cszO>EPeM3&D56>%r?!aQ;2uR%p-> za9n%#r-JW)kLUjl2#fLN^9Y=b0zQF%!8Nr7a}Tv@#|8R;=irisf#DTwS$_0!8Tfo!7xxtIUo4^~vXHec=@J9^dlVIOwc>dpnV8LDR2;3Nh z=q-3UScGs7TnBrDcQxh)=LOGh&0H94Yr|X?JkSXt8iLPp4rmO1h(Xp4yabn|H~0|- z*)VV&@MLf<4C1-qrfASou(Kj=i;WQ8ph5e=yHVgN@JKZ15Af^G+~5b`*_e1ffScgH zw}o<#Rd2-cxtN`nEa!0N#TPG2jyLw*mKtzb81h30E)_+z31o90Jx2cG53Y z;5J%@fV$vK;Qd{=z`fw0uFR*wInX25z%ER+f0_AlTmG$>=7Ds~178%Y=fC;&9gi^X zq9=G*$LHU(SNfukX|Y{_1eo6s zngce!-t!Z<1Fc-B-Ig_A^J~3Z!RFU`_k+!^?fwonzvg=>49|b_d%m|2V1BPR18jb; z_Z=AD>$N!YbB~!{>-7hlU+WD6hf`Op1}oj066V)>E9a-{uLSdZy$uj>kVdb{&=PEZ zueTGJzt>CuLjbVxwO)#k2OHmfCLRx7Sb)o$3*JapmA|3_gw=&u*akMf7EA$$!MkY+ QRvFHMySlU=9l@plKN&2Kd;kCd diff --git a/3rdparty/bx/tools/bin/linux/genie b/3rdparty/bx/tools/bin/linux/genie index 8db245dfb99b820b30ff8c10b15cb69a35281f02..51f11086241ee82e5c7737a3d4a148d4b239d415 100644 GIT binary patch delta 36512 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

    *MNr`l4 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 aL0Rk;y4Ho)#dKJ$EDne$!=hzHQ2zssiVk`J diff --git a/3rdparty/bx/tools/bin/windows/genie.exe b/3rdparty/bx/tools/bin/windows/genie.exe index 0553e86fc454ad1f1118bd18883613e0f1bb7301..d33aa2697258b8c9df0d35d17abdedc65ae4f68b 100644 GIT binary patch delta 20465 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 R1boY|ly1|Sh*t3f`9IM+zA^v+ delta 17993 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